为何SQLite允许为主键列插入NULL值而MySQL不行?
为什么SQLite允许插入NULL到主键列而MySQL报错?
这个问题的核心在于SQLite和MySQL对SQL标准中主键约束的实现差异,尤其是在NULL值处理上的宽松程度不同,具体原因如下:
1. SQLite对主键约束的宽松实现(非严格遵循SQL标准)
SQL标准明确要求主键列必须满足「唯一且非空」,但SQLite在这方面做了灵活处理:
- 如果你定义主键时没有显式添加
NOT NULL约束,SQLite不会自动给主键列加上非空限制,允许插入NULL值。 - 这里有个例外:如果主键列是
INTEGER PRIMARY KEY(注意是INTEGER而非INT),它会关联到SQLite内部的ROWID,这时才会强制非空。你的代码里ID是INT类型的主键,没加NOT NULL,所以SQLite允许插入NULL。
2. MySQL严格遵循SQL标准的主键约束
MySQL对主键的实现完全贴合SQL标准:
- 主键列默认隐含
NOT NULL约束,不管你有没有显式写出这个关键字。所以当你尝试把NULL插入主键ID列时,MySQL直接抛出ER_BAD_NULL_ERROR错误,这是符合标准的预期行为。
3. 验证:给SQLite主键加NOT_NULL后的行为
如果把你的建表语句修改为:
CREATE TABLE EMPLOYEE ( ID INT NOT NULL PRIMARY KEY, Name VARCHAR(15) NOT NULL, Age INT, Dnumber INT, Level INT );
再尝试插入NULL的ID,SQLite也会报错,和MySQL的行为一致——这说明SQLite只是默认不对主键列强制非空,并非完全不支持该约束。
内容的提问来源于stack exchange,提问作者huy
相关产品推荐
相关产品推荐

