sql - 多列主键还是唯一约束?

标签 sql indexing primary-key

我有一个 Country 表,其中包含 IDNameCode 列。所有这三列都应包含唯一值,并且不能为 NULL。

我的问题是,我是否最好在 ID 列上创建主键,并为 NameCode 创建唯一约束列(我猜是在一个索引中),或者最好只在主键中包含 NameCode 列以及 ID >?为什么?多列主键是否会带来潜在的缺点或复杂性?

最佳答案

首先 - 是的,由三列组成的复合主键使得连接到该表变得更烦人 - 任何其他想要连接到 Country 表的表必须具有所有三列建立连接。

更重要的是 - 它相同的限制!

如果您在 ID 上有 PK,并且对 CodeName 分别有唯一约束,那么这是无效有效的:

ID    Code     Name
--------------------------
41    CH       Switzerland
341   CH       Liechtenstein
555   LIE      Liechtenstein

因为CodeCHNameLiechtenstein都出现了两次。

但是,如果您在所有三列上都有一个 PK - 那么这是有效,因为每行都有不同的元组数据 - ( 41CHSwitzerland ) 与 ( 341CHLiechtenstein ) 相同,因此这两行是可接受的。

如果您同时将 PK 放在所有三列上,则唯一性仅扩展到整个元组(所有三列) - 每列分别可以有“重复项”。

所以它实际上归结为

  • 您真正需要什么(独特性)
  • 您希望加入此表的过程有多简单

关于sql - 多列主键还是唯一约束?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22153935/

相关文章:

mysql - 构造mysql大表

asp.net - ' ?' 附近的语法不正确

mysql - 当字段值不明确时如何优化 MySQL 查询

json - Django休息框架: Deserializing and get the primary key from validated_data

php - 当另一个表保存特定值时,如何使用 MySQL 将某些内容插入到表中

sql - SQL Server 中几个表的一般报告

python - 如何使用修改后的索引来旋转 pandas 数据框?

search - 扩展 Orchard 搜索和索引

python - 在 SQLAlchemy 中使用序列生成字符串主键

sql - 具有时间有效性的 Oracle 表的主键违规