SQLite列限制:仅限整数

时间:2017-03-02 17:10:43

标签: database sqlite text integer sqldatatypes

以下代码行说明了表的创建以及使用数据类型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"

尝试限制失败。

2 个答案:

答案 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中不允许这样做,其中数据必须与列的类型匹配。