我正在做一个 SQL 项目。当我声明外键时,我遇到了一个问题。部分键(属性是主键的一部分)可以是外键吗?
编辑:感谢大家的帮助。我想我刚刚解决了这个问题。但我有一个新问题。如果t1(a, b, c),t1的主键是(a,b),那么其他表的FK怎么指向这个表呢?
我正在做一个 SQL 项目。当我声明外键时,我遇到了一个问题。部分键(属性是主键的一部分)可以是外键吗?
编辑:感谢大家的帮助。我想我刚刚解决了这个问题。但我有一个新问题。如果t1(a, b, c),t1的主键是(a,b),那么其他表的FK怎么指向这个表呢?
假设您的主键由两个字段(a,b)组成。a 或 b 可以是指向其他表的外键。但是,如果另一个表有一个指向您的表的 FK,则您需要在另一个表中同时包含 (a, b) 的复合 FK。
可能,如果该属性保证唯一标识主表中的记录。 但是,如果它满足该保证,那么为什么它没有被用作实际的主键呢?
为了避免很多麻烦,我建议您使用自动生成递增数字的数据类型作为主键,并将该键声明为相关表中的外键。大多数关系数据库已经具有符合此描述的数字类型。
如果您正在谈论的表是外键的右侧 - 是的。如果复合 PK 表是 FK 的左侧 - 那么另一个表必须与复合键匹配。
如果你有tbl_1
带有 PK ( col1
, col2
) 和tbl_2
column的表col3
,你可以有 FK from tbl_2.col3
totbl_1.col2
例如,(只要类型匹配并且tbl_2.col3
是唯一的)但不是 from tbl_1.col2
totbl_2.col3
编辑
如果情况是具有tbl_1
复合 PK 的表 ( ) 应该具有其他表的外键,则您必须使其他表包含所有列,以便它可以形成tbl_1
PK 的组合,或者更改tbl_1
PK . 假设tbl_1.col1
并tbl_1.col2
形成 PK ,您可以通过对和tbl_1
进行唯一约束来更改它,并添加您制作 PK 的单个列。tbl_1.col1
tbl_1.col2
tbl_1.pk
大多数 ORM 解决方案建议避免使用复合键 - 改为使它们唯一,并使用单个 PK 列 - 通常integer
或long/bigint
. 因此,您将更轻松地建立关系,并且单个数字列的 PK 性能会更好。