为什么SQL表有多个主键?

时间:2011-10-25 08:32:02

标签: sql primary-key primary-key-design

在我的工作(利用我的一些编程技能的非编程工作)上,我被要求从我们的外包定制程序的SQL数据库生成报告。

在查看表格时,我看到其中很多都有多个字段分配为PK,为什么会这样?这对串行数字ID有什么好处?

4 个答案:

答案 0 :(得分:2)

数据完整性。密钥表示唯一性约束,可防止重复数据进入数据库。密钥有助于确保数据库中的事实可以使用它们应描述的真实对象或概念正确识别。实际上,并非所有内容都可以或应该由单个列中的单个属性识别。

注意:具有多个属性的键不是多个键。它仍然只是一个键(称为复合键)。

答案 1 :(得分:1)

它被称为复合键。如果order_no是表Order和表Order_Item中的主键,则在分配给每个订单商品的订单中有一个唯一的序列号,即所有订单都包含以序号1开头的商品,然后是Order_Item的主键是order_no, item_sequence_no

将此与Order_Item生成的主键进行对比:您仍然需要order_no, item_sequence_no上的唯一索引。如果您考虑查询,您可能会发现更多依赖于复合键。

业务依赖和系统生成的密钥在技术上分别称为域密钥和代理密钥。 c2 wiki对此进行了很好的讨论。

答案 2 :(得分:0)

有时,表中的多个值将形成一个自然的主键,而不是代理,自动生成的主键。

这样做的一些优点是,如果这些多个值唯一地标识记录,则PK强制执行唯一性,并且在MS SQL Server中,默认情况下PK也将是表上的聚簇索引。

答案 3 :(得分:0)

这取决于用作PK的表和列。

如果表if if是多对多关联中使用的连接表,那么您可以使用外键列中的复合主键(因为它们的组合在连接表中是唯一的)而没有其他合成主要将需要钥匙。

其他示例是自然键,当现有列值的某些组合可用于唯一引用表中的行时(例如,人员的名字和姓氏)。它们使用不多,因为大多数这样的候选自然键没有所需的属性(也就是说,它们不是唯一的或不可变的)。