2010-01-18 185 views
34

我對SQLite 3很新,剛纔我不得不向現有的表添加一列。我通過這樣做了:ALTER TABLE thetable ADD COLUMN category;在sqlite3中修改列的類型

當然,我忘了指定該列的類型。我想要做的第一件事是刪除該列,然後重新添加它。但是,似乎SQLite沒有這樣做的簡單方法,我不得不備份表並在沒有列的情況下重新創建表。

這似乎很混亂,我想知道是否只是修改/添加列的類型的方式。我會這麼想,但是我的搜索沒有得到任何結果,對SQLite來說是新的,我想這是因爲我的措辭在查詢中被關閉了。

回答

40

SQLite不支持刪除或修改列,apparently。但是請記住SQLite中的列數據類型aren't rigid

參見:

+0

所以如果我沒有定義一個類型,我應該仍然能夠插入文本到它?當然,後來當我部署到生產時,我會明確說明類型(文本),但現在我應該沒問題? – 2010-01-18 02:31:47

+2

是的。您也可以在該列中插入非文本值:「SQLite使用更通用的動態類型系統。在SQLite中,值的數據類型與值本身相關聯,而不與其容器相關聯。」 (從我的第二個鏈接)指定列的類型在SQLite中的重要性遠遠低於其他RDBM。 – 2010-01-18 02:39:53

+2

這是真的......但是如果您以後使用您將使用的數據類型創建其他表,那麼您的連接查詢將無法使用索引,因爲列不會具有相同的類型 – DallinDyer 2013-03-12 17:56:46

2

有可能通過重新table.Its爲我工作,請按照下列步驟:

  1. 使用作爲選擇創建臨時表從*您的表格
  2. 拖放您的表格,使用修改列類型創建您的表格
  3. 立即將其插入從臨時表中的記錄到新創建的表
  4. drop臨時表

做工作線程所有上述步驟,以減少對uithread

0
#!/bin/bash 

DB=/tmp/synapse/homeserver.db 
TABLE="public_room_list_stream" 
FIELD=visibility 
OLD="BOOLEAN NOT NULL" 
NEW="INTEGER NOT NULL" 
TMP=/tmp/sqlite_$TABLE.sql 

echo "### create dump" 
echo ".dump '$TABLE'" | sqlite3 "$DB" >$TMP 

echo "### editing the create statement" 
sed -i "s|$FIELD $OLD|$FIELD $NEW|g" $TMP 

read -rsp $'Press any key to continue deleting and recreating the table $TABLE ...\n' -n1 key 

echo "### rename the original to '$TABLE"_backup"'" 
sqlite3 "$DB" "PRAGMA busy_timeout=20000; ALTER TABLE '$TABLE' RENAME TO '$TABLE"_backup"'" 

echo "### delete the old indexes" 
for idx in $(echo "SELECT name FROM sqlite_master WHERE type == 'index' AND tbl_name LIKE '$TABLE""%';" | sqlite3 $DB); do 
    echo "DROP INDEX '$idx';" | sqlite3 $DB 
done 

echo "### reinserting the edited table" 
cat $TMP | sqlite3 $DB 
4

負載如果你喜歡一個GUI ,DB Browser for SQLite只需點擊幾下即可完成。

  1. 「文件」 - 「打開數據庫」
  2. 在「數據庫結構」選項卡,單擊表的內容(不表名),然後在「編輯」菜單下的「修改表」,現在你可以通過下拉菜單更改任何列的數據類型。我將「文本」字段更改爲「數字」以便檢索數字範圍內的數據。

用於SQLite的數據庫瀏覽器是開源且免費的。對於Linux,它可以從存儲庫中獲得。

+0

「*點擊表格內容(不是表格名稱)*」是什麼意思?在「數據庫結構」選項卡下,我必須單擊表格 - >我的表格下的表格名稱。我也能夠右鍵單擊表名來調出彈出式菜單,您可以在其中選擇「修改表」。 – stackoverflowuser2010 2017-07-03 16:25:45