使用外键作为复合主键的一部分

时间:2014-07-09 04:58:45

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

我在SQL Server中有两个表。第一个是属于单个作业的所有1:1关系,其主键声明如下:

CREATE TABLE Jobs(
JobNumber bigint PRIMARY KEY )

第二个表是所有作业组件及其1:1关系的列表。

每个组件通过其作业编号引用单个作业,该作业是外键,并且多个组件可以引用相同的作业。组件在作业中编号为1,2,3等。

在第二个表中的复合主键中使用列JobNumber(外键)是否可行且合理,以便主键由(JobNumber, ComponentNumber)组成,如下所示:

CREATE TABLE Components(
    JobNumber bigint FOREIGN KEY REFERENCES Jobs(JobNumber) NOT NULL,
    ComponentNumber int NOT NULL,
    PRIMARY KEY(JobNumber, ComponentNumber) 
)

另一种选择当然是使用代理主键,但这不会强制JobNumberComponentNumber组合的唯一性约束(第二个表中的两个记录可能有例如JobNumber=1ComponentNumber=1,所以我更喜欢使用复合自然主键。

1 个答案:

答案 0 :(得分:1)

当然,为什么不呢?我没有看到任何理由不使用复合主键!

唯一的次要缺点是,任何其他需要引用您的Components表的表现在必须使用两列来建立外键关系 - 你不能只引用表的一半主键。

另外:如果您选择使用单独的代理列作为PK,则可以始终使用唯一约束强制执行唯一性(JobNumber, ComponentNumber)....