database - 复合主键中的可为空列有什么问题?

标签 database database-design

ORACLE 不允许在构成主键的任何列中使用 NULL 值。大多数其他“企业级”系统似乎也是如此。

同时,大多数系统还允许对可空列进行唯一约束。

为什么唯一约束可以有 NULL 而主键不能?这是否有基本的逻辑原因,或者这更多是技术限制?

最佳答案

主键用于唯一标识行。这是通过将键的所有部分与输入进行比较来完成的。

根据定义,NULL 不能成为成功比较的一部分。即使是与自身的比较 (NULL = NULL) 也会失败。这意味着包含 NULL 的 key 将不起作用。

此外,外键中允许使用 NULL,以标记可选关系。(*) 在 PK 中也允许使用 NULL 会破坏这一点。


(*)提醒一句:具有可为空的外键并不是干净的关系数据库设计。

如果有两个实体 AB 其中 A 可以选择与 B 相关,干净解决方案是创建一个解析表(比方说 AB)。该表会将 AB 链接起来:如果 存在关系,则它将包含一条记录,如果不存在 那么它就不会了。

关于database - 复合主键中的可为空列有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/386040/

相关文章:

mysql - 存储航线成本的DB设计

mysql - 比较 Mysql 上的 2 个数据库模式

sql - 良好的数据库和结构来存储同义词

c++ - 数据结构优化

mysql - 最佳实践在一张表中创建表或使用mysql中的ID

mysql - 如何设计关联多个标签id的关系型数据库?

java - 即使数据存在,我的 MongoDB .find() 方法也返回 null

php - 连接评论列表的表并确定用户是否已经对评论投了赞成票/反对票

带有加密文件系统的 MySQL 数据库用于存储图像

mysql - 用于传输数据库更改的工具?