Sqlite

在 sqlite 中使用正確的數據類型更新表模式

  • July 23, 2018

我知道從 CSV 導入 SQLite 會將所有欄位都視為文本。根據How to import csv file to sqlite with correct data types,可以使用

UPDATE MyTable SET MyColumn = CAST(MyColumn AS INTEGER)

更新整個列類型。這似乎有效,但這似乎並沒有反映TYPEOF()PRAGMA table_info(table_name)

sqlite> CREATE TABLE testtb (a TEXT, b TEXT);
sqlite> INSERT INTO testtb VALUES ('1', '2');
sqlite> UPDATE testtb SET b = CAST(b AS INTEGER);
sqlite> SELECT TYPEOF(b) FROM testtb;
text
sqlite> PRAGMA table_info(testtb);
0|a|TEXT|0||0
1|b|TEXT|0||0

那麼,在查詢表的元資訊時,如何才能使更改真正顯示出來(我在這裡缺少正確的措辭,但希望這是有道理的)?

如果您真的想要,只需將您的第一個表用作臨時表,然後再繼續創建具有正確數據類型和數據的最終表:

sqlite> PRAGMA table_info(testtb);
0|a|TEXT|0||0
1|b|TEXT|0||0
sqlite> create table testtb2 (a INT, b INT);
sqlite> insert into testtb2 (a,b) select a,b from testtb ;
sqlite> select * from testtb2;
1|2
sqlite> PRAGMA table_info(testtb2);
0|a|INT|0||0
1|b|INT|0||0
sqlite> 

歸根結底,您必須記住(在某種程度上)sqlite 實際上並不關心 datatypes

SQLite 在數據類型方面非常靈活。

一些評論家說 SQLite 是“弱類型”,而其他 SQL 數據庫是“強類型”。我們認為這些術語是不准確的和瀉藥的。我們更願意說 SQLite 是“靈活類型”的,而其他 SQL 數據庫是“剛性類型”的。

關鍵是 SQLite 對您放入數據庫的數據類型非常寬容。例如,如果一列的數據類型為“INTEGER”並且應用程序將文本字元串插入該列,SQLite 將首先嘗試將文本字元串轉換為整數,就像所有其他 SQL 數據庫引擎一樣。因此,如果將“1234”插入 INTEGER 列,則該值將轉換為整數 1234 並儲存。但是,如果你在 INTEGER 列中插入一個像 ‘wxyz’ 這樣的非數字字元串,與其他 SQL 數據庫不同,SQLite 不會引發錯誤。相反,SQLite 將實際的字元串值儲存在列中。

引用自:https://dba.stackexchange.com/questions/212912