【问题标题】:Why I can add null value to primary key in SQLite?为什么我可以在 SQLite 中向主键添加空值?
【发布时间】:2021-02-21 11:00:43
【问题描述】:

我有这个代码,你可以试试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 的原因是什么?

【问题讨论】:

  • 我不能代表 SQLite 但主键列在我使用的任何数据库引擎中都不能为空。
  • @ÁlvaroGonzález 是的,没错。我只是不知道为什么 SQLite 允许它为空。
  • @huy 签入documentation 怎么样?第 3.5 节
  • 对于 sqlite 中的主键关联,您应该使用 INTEGER,而不是 INT - 请参阅 sqlite.org/lang_createtable.html#rowid
  • @huy 随意回答您自己的问题(这是允许和鼓励的),但请不要在问题中包含答案 ;-)

标签: mysql sql sqlite


【解决方案1】:

感谢@astentx 的建议,我检查了documentation,它说:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 请回答“我可以将它添加到 SQLite 的原因是什么?”这个问题。 - OP 已经声明 NULL 在 MySQL 中是不允许的
    【解决方案3】:

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

    官方文档:

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

    【讨论】:

    • 请回答“我可以将它添加到 SQLite 的原因是什么?”这个问题。 - OP 已经声明 NULL 在 MySQL 中是不允许的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-26
    • 2010-10-31
    • 2023-02-25
    • 1970-01-01
    • 1970-01-01
    • 2023-02-04
    相关资源
    最近更新 更多