具有实用方法的复合主键

时间:2018-05-09 16:33:19

标签: sql sql-server composite-primary-key

我只需要理解复合主键背后的概念。我已经开始搜索它,了解它是一个表格的多个列的组合。但我的问题是,这个密钥对任何数据的实用方法是什么?什么时候我应该使用这个概念?你能告诉我在excel或SQL服务器上这个键的实际用法吗?

对于任何sql专家来说,这可能是一种奇怪的问题。我为这种愚蠢的问题道歉。如果有人觉得这是一个愚蠢的问题,请原谅我。

2 个答案:

答案 0 :(得分:1)

我们说我有一张车的桌子。它包括汽车的型号和制造。我不想把同样的汽车插入我的桌子,但是有些汽车将拥有相同的品牌和汽车将具有相同的型号(假设福特和丰田制造一辆名为“BlergWagon&#39的汽车” )。

我可以使用包含两个值的复合键来强制make / model的唯一性。 Just make上的一个独特的钥匙不允许我添加超过1辆丰田,并且只是模型上的唯一钥匙不允许我输入超过1辆BlergWagon。

另一个例子是成绩,学期,年级,学生和班级。我可以为特定年份的班级和特定学期的学生强制执行唯一性,这样我的桌子就不会有2个在同一学期同一学期同一学期的同一班级的重复记录。

你的帖子的另一部分是关于主键,我假设这意味着你在谈论聚集索引。聚簇索引强制执行表的顺序。因此,您可以将其放入标识列以对表进行排序,并添加唯一的非聚簇索引以强制其他列上的唯一性。

答案 1 :(得分:1)

复合主键的典型用例是结点/关联表。考虑订单和产品。一个订单可能有很多产品。一种产品可能有很多订单。 orderProducts表可以定义为:

create table orderProducts (
    orderId int not null references orders(orderId),
    productId int not null references products(productId),
    quantity int,
    . . .
);

(orderId, productId)声明为复合主键是有意义的。这将限制任何给定订单只有一次给定产品。

那就是说,我通常会使用合成密钥(orderProductId)并简单地将组合声明为unique

复合主键的好处在于它强制使用唯一性(也可以使用唯一性约束来完成)。它还浪费了额外密钥所不需要的空间。

identity键相比,复合主键存在缺点:

  • 标识键可跟踪插入顺序。
  • 身份密钥通常只有4个字节。
  • 外键引用只包含一列。
  • 默认情况下,SQL Server在主键上进行群集。这会产生一种排序,并可能导致碎片化(尽管这个例子值得怀疑)。