我正在做一个SQL项目。当我宣布外键时,我提出了一个问题。部分密钥(属性是主键的一部分)可以是外键吗?
编辑:感谢大家的帮助。我想我刚解决了这个问题。但我有一个新问题。如果t1(a,b,c)和t1的主键是(a,b),那么其他表的FK如何指向该表?答案 0 :(得分:2)
假设您的主键由两个字段(a,b)组成。 a或b可以是指向其他表的外键。但是如果另一个表有一个FK指向你的表,你需要在另一个表中使用复合FK(a,b)。
答案 1 :(得分:1)
可能,如果属性保证唯一地标识主表中的记录。但是,如果它满足该保证,那么为什么它不被用作实际的主键?
为了避免很多麻烦,我建议您使用自动生成递增数字作为主键的数据类型,并将该密钥声明为相关表中的外键。大多数关系数据库已经具有符合此描述的数字类型。
答案 2 :(得分:0)
如果您正在谈论的表是外键的右侧 - 是的。如果复合PK表是FK的左侧 - 则另一个表必须与复合键匹配。
如果您的表格tbl_1
包含PK(col1
,col2
)和tbl_2
列col3
,那么您可以从{{1}获得FK例如,tbl_2.col3
,(只要类型匹配且tbl_1.col2
是唯一的),但不是从tbl_2.col3
到tbl_1.col2
修改强>
如果情况是具有复合PK的表(tbl_2.col3
),该表应具有其他表的外键,则必须使另一个表包含所有列,以便它可以形成{的组合{1}} PK,或更改tbl_1
的PK。假设tbl_1
和tbl_1
构成tbl_1.col1
的PK,您可以通过设置tbl_1.col2
和tbl_1
的唯一约束并添加单列{{}来更改它1}}你做PK。
大多数ORM解决方案建议避免使用复合键 - 使其成为唯一,并使用单个PK列 - 通常为tbl_1.col1
或tbl_1.col2
。因此,您将更容易建立关系,单个数字列的PK性能会更好。