我将一个表定义为:
CREATE TABLE Stocks (
name CHAR(24),
price CHAR(22),
symbol CHAR(3),
PRIMARY KEY name);
具体地说,符号应该是一个3个字母的字符串,例如"0";AUS";。然而,sqlite3仍然允许我插入长度大于3的符号,例如";澳大利亚";。为什么不在输入中强制使用3个字符的数据类型?
将sqlite视为"动态类型的";SQL版本。
从其文件来看:";SQLite支持";类型亲和性";在列上。列的类型相关性是存储在该列中的数据的推荐类型。这里的重要思想是,该类型是推荐的,而不是必需的。任何列仍然可以存储任何类型的数据">
除非添加检查约束,否则在更新/插入值时不会进行检查。它只会接受新的。
事实上,您不必在create表中指定类型。类型相关性在某些操作中会产生一些问题,例如按.排序
例如:
sqlite> create table R(a);
sqlite> insert into r values (1), (-5), (3);
sqlite> select * from r order by a;
a
--
-5
1
3
以及之后:
sqlite> insert into r values ('aaaa');
sqlite> insert into r values ('000');
sqlite> select * from R order by a;
a
--
-5
1
3
000
aaaa
因此,在sqlite:中铸造值是值得的
sqlite> select * from r order by cast(a as int);
a
--
-5
000
aaaa
1
3
请注意,"aaaa"将转换为0。可能有一种方法可以将其转换为NULL,但这是留给读者练习的。
SQLite中没有CHAR
数据类型
实际上,您可以(几乎(使用任何内容作为列的数据类型,SQLite不会抱怨
您可以阅读更多关于SQLite数据类型的信息
如果您想要字符串列的最大长度,请将它们定义为TEXT
,并设置CHECK
约束:
CREATE TABLE Stocks (
name TEXT CHECK(LENGTH(name) <= 24),
price TEXT CHECK(LENGTH(price) <= 22),
symbol TEXT CHECK(LENGTH(symbol) <= 3),
PRIMARY KEY (name)
);
查看简化的演示