【发布时间】:2011-04-23 20:05:44
【问题描述】:
关于我的问题"Why to use ´not null primary key´ in TSQL?"...
据我从其他讨论中了解到,某些 RDBMS(例如 SQLite、MySQL)允许在主键中使用“唯一”NULL。
为什么允许这样做,它有什么用处?
背景:我认为了解基本概念、方法及其在不同 DBMS 中的实现的差异对于与同事和数据库专业人员的交流是有益的。
注意事项
- MySQL 已修复并返回到“NOT NULL PK”列表。
- SQLite 已添加到“NULL PK”列表中(感谢 Paul Hadfield):
为了确定主键值的唯一性,NULL 值被认为不同于所有其他值,包括其他 NULL。
如果 INSERT 或 UPDATE 语句尝试修改表内容,以便两行或多行具有相同的主键值,则违反约束。根据 SQL 标准,PRIMARY KEY 应始终暗示 NOT NULL。不幸的是,由于长期的编码疏忽,SQLite 并非如此。
除非列是 INTEGER PRIMARY KEY SQLite 允许在 PRIMARY KEY 列中使用 NULL 值。我们可以更改 SQLite 以符合标准(我们将来可能会这样做),但是当疏忽被发现时,SQLite 已被广泛使用,以至于我们担心如果我们解决了问题会破坏遗留代码。
所以现在我们选择继续在 PRIMARY KEY 列中允许 NULL。但是,开发人员应该知道,我们将来可能会更改 SQLite 以符合 SQL 标准,并应相应地设计新程序。
【问题讨论】:
-
我不知道旧版本的 MySQL 是否对此有所不同,但从现代版本开始,主键必须在非空列上。请参阅dev.mysql.com/doc/refman/5.1/en/create-table.html:“PRIMARY KEY 是一个唯一索引,其中所有键列都必须定义为 NOT NULL。如果它们没有显式声明为 NOT NULL,MySQL 会隐式(并且静默地)声明它们。”
-
@Hammerite,这绝对不仅仅是评论,你为什么不发布答案?我有相当长的 MySQL 教授的帖子列表,确定 NULL 在 PK 中的使用,我真的应该给吗?
-
好的,我做了一个回答说。我不知道你的第二个问题是什么意思。这些人对空键和主键有什么看法?
-
仅仅因为 RDBMS 的默认行为可能允许这种异常,并不意味着您也必须允许它。只需在您的设计中的列上放置一个 NOT NULL 约束,瞧。它按照上帝的意图运作。
标签: database database-design relational-database terminology