2017-03-02 27 views
0

以下代碼行說明了表的創建方式以及使用數據類型INTEGER創建年齡列的位置,但仍然可以插入TEXT。SQLite列限制:只有整數

sqlite> .open dummy.db 
sqlite> CREATE TABLE dummy1 (_id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, age INTEGER); 
sqlite> INSERT INTO dummy1(name, age) VALUES ("varma", 40); 
sqlite> INSERT INTO dummy1(name, age) VALUES ("sandy", sixty); 
Error: no such column: sixty 
sqlite> INSERT INTO dummy1(name, age) VALUES ("sandy", "sixty"); 
sqlite> SELECT * FROM dummy1; 
1|varma|40 
2|sandy|sixty 

我想表的創建與列的限制爲:「年齡INTEGER」

嘗試限制失敗。

回答

2

SQLite使用dynamic typing;如果要強制列類型,你必須使用一個明確的約束:

CREATE TABLE dummy1 (
    ..., 
    age INTEGER CHECK (typeof(age) = 'integer') 
); 
1

這在SQLite中是允許的,因爲SQLite具有「動態類型系統」,這意味着數據類型與存儲的內容相關聯,而不是在表定義中定義的內容。一切都在內部存儲爲TEXT。

https://www.sqlite.org/datatype3.html

SQLite的使用更一般的動態型系統。在SQLite中,值的 數據類型與值本身關聯,而不是與其 容器關聯。 SQLite的動態類型系統向後兼容 與其他數據庫引擎的更常見的靜態類型系統 這種意義上說,在靜態類型數據庫 上運行的SQL語句應該在SQLite中以相同的方式工作。但是,SQLite的動態類型允許它執行在傳統的 嚴格類型數據庫中不可能做的事情。

這是不允許在其他RDBMS如Oracle,SQL Server等,其中數據必須匹配列的類型。

+0

如果一切門店爲文本。它不會使數據庫的大小更大嗎? – Varma