ORACLE 不允许在包含主键的任何列中使用 NULL 值。大多数其他“企业级”系统似乎也是如此。
同时,大多数系统还允许可空列上 的唯一 约束。
为什么唯一约束可以有 NULL 而主键不能?这是否有一个基本的逻辑原因,或者这更多的是技术限制?
主键用于唯一标识行。这是通过将键的所有部分与输入进行比较来完成的。
根据定义,NULL 不能成为成功比较的一部分。即使与自身 ( NULL = NULL) 进行比较也会失败。这意味着包含 NULL 的键将不起作用。
NULL = NULL
此外,外键中允许使用 NULL,以标记可选关系。(*)允许它在 PK 中也会打破这一点。
(*)提醒一句:具有可为空的外键不是干净的关系数据库设计。
如果有两个实体A并且可以选择与Bwhere相关联,则干净的解决方案是创建一个解析表(比如说)。该表将链接:如果存在 关系 ,则它将包含一条记录,如果 没有 ,则它不会。A``B``AB``A``B
A
B
A``B``AB``A``B