2017-03-02 83 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