You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 19:47:48