SQLite建表时TEXT NULL语法中的NULL是否显式表示字段可空?
SQLite字段定义中
NULL关键字的作用解答 你提到的FooColumn2 TEXT NULL定义里的NULL,就是显式声明该字段允许存储NULL值的标准写法,不存在其他特殊含义。
具体规则如下:
- SQLite的字段可空性约束逻辑非常明确:如果字段后显式加
NOT NULL,则该字段禁止存储NULL值,写入NULL会直接触发约束错误;如果字段后显式加NULL,则明确标记该字段允许存储NULL值。 - 如果建表时字段后既不写
NULL也不写NOT NULL,SQLite的默认规则就是允许存储NULL值。也就是说FooColumn2 TEXT和FooColumn2 TEXT NULL的实际运行效果完全没有区别,写NULL更多是为了提升语句可读性,和相邻的NOT NULL约束形成明确对照,让读表结构的人一眼就能确认两个字段的空值规则是刻意设计的,不是漏写了约束。
拿你给出的示例建表语句来说:
CREATE TABLE IF NOT EXISTS FooTable (FooColumn1 TEXT NOT NULL, FooColumn2 TEXT NULL)
这个语句执行后,两个字段的约束非常清晰:
FooColumn1强制非空,任何场景下给这个字段写入NULL都会报错FooColumn2允许为空,你可以正常往这个字段插入NULL值,不会触发任何约束问题,和省略NULL关键字的默认表现完全一致,没有额外的隐藏规则、类型转换或者特殊副作用。
这里提一个容易混淆的点:不要把这个位置的NULL关键字和默认值规则搞混,它只负责控制字段是否允许存储NULL,不会自动给字段加默认值,也不会修改字段的类型亲和性、约束优先级等其他属性。
内容的提问来源于stack exchange,提问作者the_prole
相关产品推荐
相关产品推荐

