首页 文章

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

提问于
浏览
2

我在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 回答

  • 1

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

    唯一的小缺点是,任何其他需要引用您的 Components 表的表现在也都是 must use 两列来 Build 外键关系 - 您不能仅引用表的一半主键 .

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

相关问题