外键可以引用具有复合(即两列的组合)键的表吗?

Posted

技术标签:

【中文标题】外键可以引用具有复合(即两列的组合)键的表吗?【英文标题】:Can foreign key reference to a table with composite(i.e combination of two columns) key? 【发布时间】:2014-01-01 04:56:03 【问题描述】:
**Table 1**
BOOK(bookID,bookEdition,bookName)

其中 (bookID,bookEdition) 的组合用作键

**Table2**
SHELF(id,shelfCode,book)

现在我希望 table2 中的列“book”引用 Table1 中的复合键(bookID,bookEdition)。

任何人都可以请指导我这样做的正确方法是什么。或者如果我的方法有误,请纠正我

或者我们不能给带有复合键的表添加外键约束??

【问题讨论】:

或者总而言之可以如上所述添加外键约束 Table2 中的列book 是什么数据类型?外键匹配两个表中相同数量的列。在您的模型中,book 如何知道它属于哪个bookIdbookEdition 这就是我的问题。 . .数据类型相同,我想添加外键约束,上面提到的场景可以吗?? 如果您想从 Table2 FK 到 Table1,请将列 book 替换为 BookIdbookEdition,以便您想要 FK 的列在两个表中。 【参考方案1】:

如果您有一个复合主键(由多个列组成),那么您的所有外键也必须使用 PK 的所有列来引用该表。因此,外键约束只能引用整个键,而不是键的一部分。

要么将bookIDbookEdition 添加到SHELF 表中(这对我来说更有意义,因为bookIDbookEdition 一起可以唯一地标识一本书)或者为Book 创建一个单独的主表(使用键 bookID)并在所有其他表中引用该表。

【讨论】:

以上是关于外键可以引用具有复合(即两列的组合)键的表吗?的主要内容,如果未能解决你的问题,请参考以下文章

复合求和:我想创建一个复合查询,它从两个不同的表中获取两列的单独总和,然后对它们求和

RedBeanPHP中具有两列主键的表

如何为具有复合主键的表构建外键?

将 MyISAM 转换为 InnoDB,其中表具有两列(复合)PK,其中之一是自动增量

SQL Server:在具有两列的表上进行无聚合的旋转

基于sql中的第三列返回两列的所有组合