-3

我正在做一个 SQL 项目。当我声明外键时,我遇到了一个问题。部分键(属性是主键的一部分)可以是外键吗?

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

4

3 回答 3

2

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

于 2013-04-02T18:25:20.127 回答
1

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

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

于 2013-04-02T18:24:53.230 回答
0

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

如果你有tbl_1带有 PK ( col1, col2) 和tbl_2column的表col3,你可以有 FK from tbl_2.col3totbl_1.col2例如,(只要类型匹配并且tbl_2.col3是唯一的)但不是 from tbl_1.col2totbl_2.col3


编辑

如果情况是具有tbl_1复合 PK 的表 ( ) 应该具有其他表的外键,则您必须使其他表包含所有列,以便它可以形成tbl_1PK 的组合,或者更改tbl_1PK . 假设tbl_1.col1tbl_1.col2形成 PK ,您可以通过对和tbl_1进行唯一约束来更改它,并添加您制作 PK 的单个列。tbl_1.col1tbl_1.col2tbl_1.pk

大多数 ORM 解决方案建议避免使用复合键 - 改为使它们唯一,并使用单个 PK 列 - 通常integerlong/bigint. 因此,您将更轻松地建立关系,并且单个数字列的 PK 性能会更好。

于 2013-04-02T18:25:26.363 回答