以下代码行说明了表的创建以及使用数据类型INTEGER创建age列但仍能插入TEXT的位置。
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
我尝试使用列限制创建表格:" age INTEGER"
尝试限制失败。
答案 0 :(得分:1)
SQLite使用dynamic typing;如果要强制执行列类型,则必须使用显式约束:
CREATE TABLE dummy1 (
...,
age INTEGER CHECK (typeof(age) = 'integer')
);
答案 1 :(得分:0)
SQLite允许这样做,因为SQLite具有“动态类型系统”,这意味着数据类型与存储的内容相关联,而不是与表定义中定义的内容相关联。一切都在内部存储为TEXT。
来自https://www.sqlite.org/datatype3.html:
SQLite使用更通用的动态类型系统。在SQLite中 值的数据类型与值本身相关联,而不是与其相关联 容器。 SQLite的动态类型系统是向后兼容的 与其他数据库引擎的更常见的静态类型系统 在静态类型数据库上工作的SQL语句的意义 应该在SQLite中以相同的方式工作。但是,动态输入 SQLite允许它做传统中不可能的事情 严格类型化的数据库。
在Oracle,SQL Server等其他RDBMS中不允许这样做,其中数据必须与列的类型匹配。