数据库复合PK - 如何正确制作FK?

时间:2013-04-02 18:22:20

标签: sql database foreign-keys

我正在做一个SQL项目。当我宣布外键时,我提出了一个问题。部分密钥(属性是主键的一部分)可以是外键吗?

编辑:感谢大家的帮助。我想我刚解决了这个问题。但我有一个新问题。如果t1(a,b,c)和t1的主键是(a,b),那么其他表的FK如何指向该表?

3 个答案:

答案 0 :(得分:2)

假设您的主键由两个字段(a,b)组成。 a或b可以是指向其他表的外键。但是如果另一个表有一个FK指向你的表,你需要在另一个表中使用复合FK(a,b)。

答案 1 :(得分:1)

可能,如果属性保证唯一地标识主表中的记录。但是,如果它满足该保证,那么为什么它不被用作实际的主键?

为了避免很多麻烦,我建议您使用自动生成递增数字作为主键的数据类型,并将该密钥声明为相关表中的外键。大多数关系数据库已经具有符合此描述的数字类型。

答案 2 :(得分:0)

如果您正在谈论的表是外键的右侧 - 是的。如果复合PK表是FK的左侧 - 则另一个表必须与复合键匹配。

如果您的表格tbl_1包含PK(col1col2)和tbl_2col3,那么您可以从{{1}获得FK例如,tbl_2.col3,(只要类型匹配且tbl_1.col2是唯一的),但不是从tbl_2.col3tbl_1.col2


修改

如果情况是具有复合PK的表(tbl_2.col3),该表应具有其他表的外键,则必须使另一个表包含所有列,以便它可以形成{的组合{1}} PK,或更改tbl_1的PK。假设tbl_1tbl_1构成tbl_1.col1的PK,您可以通过设置tbl_1.col2tbl_1的唯一约束并添加单列{{}来更改它1}}你做PK。

大多数ORM解决方案建议避免使用复合键 - 使其成为唯一,并使用单个PK列 - 通常为tbl_1.col1tbl_1.col2。因此,您将更容易建立关系,单个数字列的PK性能会更好。