为什么我可以在SQLite中为主键添加空值?

问题描述 投票:0回答:4

我有这个代码,你可以试试db-fiddle

CREATE TABLE EMPLOYEE
( ID        INT,
  Name      VARCHAR(15) NOT NULL,
  Age       INT,
  Dnumber   INT,
  Level     INT,
  PRIMARY KEY (ID)
);

INSERT INTO EMPLOYEE (ID, Name, Age, Dnumber, Level) VALUES(1,'Tom', 21, 2, 5);
INSERT INTO EMPLOYEE (ID, Name, Age, Dnumber, Level) VALUES(2,'Lucky', 22, 2, 3);
INSERT INTO EMPLOYEE (ID, Name, Age, Dnumber, Level) VALUES(NULL,'Blue', 22, 2, 3);

如果我使用 SQLite,我可以添加 NULL 值,但如果我使用 MySQL,则不能。我会收到此错误:

Schema Error: Error: ER_BAD_NULL_ERROR: Column 'ID' cannot be null

为什么我可以将其添加到SQLite?

sql mysql database sqlite null
4个回答
8
投票

感谢@astentx 的建议。我检查了文档,它说:

根据 SQL 标准,PRIMARY KEY 应始终暗示 NOT NULL。不幸的是,由于某些早期版本中的错误,SQLite 中并非如此。除非列是 INTEGER PRIMARY KEY 或表是WITHOUT ROWID 表或列声明为 NOT NULL,否则 SQLite 允许在 PRIMARY KEY 列中使用 NULL 值。 SQLite 可以修复以符合标准,但这样做可能会破坏遗留应用程序。因此,决定仅记录 SQLite 在大多数 PRIMARY KEY 列中允许 NULL 的事实。


0
投票

在 SQLite 中,基本上,您可以将

NULL
添加到
PRIMARY KEY
列,但不能将
NULL
添加到
INTEGER PRIMARY KEY
INTEGER PRIMARY KEY AUTOINCREMENT
列,即使它们没有
NOT NULL
约束。 我的回答解释得更多。


-2
投票

如果我没记错的话,MySQL 不允许主键(ID)存储 NULL。 所以你的 ID 列不能存储 NULL 值。


-3
投票

ID字段是主键(该字段存在主索引),这就是该字段不能接受空值的原因。它不应该有空的唯一值。

官方文档:

https://dev.mysql.com/doc/refman/8.0/en/constraint-primary-key.html

© www.soinside.com 2019 - 2024. All rights reserved.