2010-04-21 75 views
38

我需要修改SQLite數據庫中的列,但是我必須以編程方式執行,因爲數據庫已在生產中。從我的研究中,我發現爲了做到這一點,我必須做到以下幾點。SQLite修改列

  • 新模式創建一個新的表從舊錶到新表
  • 複製數據
  • 刪除舊錶
  • 重命名新表,舊錶命名

這似乎是一個對於那些應該相對容易的事情來說,可笑的工作量是很可觀的。有沒有更簡單的方法?我需要做的就是改變現有列的約束並給它一個默認值。

+0

的[修改列在sqlite3的類型]可能的複製(http://stackoverflow.com/questions/2083543/modify-a-columns -type-in​​-sqlite3) – rubo77 2017-01-10 20:01:39

+0

我在這裏創建了一個腳本來重命名錶中的一個字段。 http://stackoverflow.com/a/41577393/1069083 – rubo77 2017-01-10 20:04:28

回答

39

這是SQLite的(在ALTER TABLE沒有MODIFY COLUMN支持)的較知名的缺點之一,但它的在list of SQL features that SQLite does not implement

編輯:即提到,可能在將來的版本所支持的頁面進行了更新,以表明刪除位不再的情況下

7

正如所說的here,這些功能不是由SQLite實現的。

作爲一個側面說明,你可以做一個創建表的兩個第一步驟,選擇:

​​
+3

好戲,這讓我不再問「我怎樣才能改變表中的字段順序?」。 – SIFE 2013-03-03 14:37:43

+0

附註工作的唯一情況(感謝@SIFE)是一個列重新排序。對於任何列def更改,您仍然需要2個步驟:CREATE,INSERT。 ref:https://www.sqlite.org/lang_createtable.html – epox 2017-11-19 22:19:58

1

當我跑了「CREATE TABLE tmp_table的AS SELECT ID,名字從src_table」 ,我失去了所有的列類型格式(例如,時間字段變成了一個整數字段

正如最初所述似乎應該更容易,但這是我做了什麼來解決。我有這個問題B/C我想要更改列中的非空字段,並且Sqlite不會真的有幫助。

使用'SQLite管理器' Firefox插件瀏覽器(使用你喜歡的)。我通過複製舊的create語句創建了新表,進行了修改並執行了它。然後爲了獲取複製的數據,我只突出顯示了行,然後單擊「將行復製爲SQL」,用我的表名替換「someTable」,然後執行SQL。

19

如果修改不是太大(例如,改變一個varchar的長度),你可以轉儲數據庫,手動編輯數據庫定義,然後再返回導入:

echo '.dump' | sqlite3 test.db > test.dump 

然後打開該文件一個文本編輯器,搜索要修改,然後定義:

cat test.dump | sqlite3 new-test.db 
+0

在我的3BG homeserver.db中有很多大表,這需要100個小時來轉儲shema。是不是有辦法從我的數據庫中只轉儲一個表,在數據庫中刪除它,然後再次插入已更改的表? – rubo77 2017-01-10 19:08:07