当主键在不同的表中时,可以引用两个外键吗?

Posted

技术标签:

【中文标题】当主键在不同的表中时,可以引用两个外键吗?【英文标题】:Is it ok to reference two foreign keys when the primary key is in a different table? 【发布时间】:2019-12-19 12:34:26 【问题描述】:

作者(AuthorID、作者姓名、地址、电话号码、PublisherCode

图书(BookID、名称、发行日期、价格、AuthorID

Publisher(PublisherID, Name, Address, AuthorID)

PK = 粗体

FK = 斜体

我正在尝试编写一个查询

将按 PublisherID 说明图书及其各个出版商和组

我了解检索此信息的总体思路,但我想知道是否可以将一个 FK 引用到另一个 FK。

例如,book.AuthorID = publisher.AuthorID 作为 PK AuthorID 不在查询中的任何一个表中。

SELECT b.name. p.name
FROM Books b
INNER JOIN Publisher p ON b.authorID = p.publisherID
GROUP BY publisherID

【问题讨论】:

你说的不是很有意义。为什么出版商的 id 等于作者的 id?请注意,在没有任何聚合函数的情况下,GROUP BY 子句永远不合适。如需更多帮助,请参阅:Why should I provide an MCRE for what seems to me to be a very simple SQL query? 另外,请注意书籍可以有多个作者,甚至可以有多个出版商。 而且我想不出一种将 authorid 存储在发布者表中的场景。 【参考方案1】:

我认为“FK 到另一个 FK”是指获取 PublisherCode (book(authorID) -> Author(PublisherCode) -> Publisher)。

我不会这样做,因为 Publisher 是图书的属性,而不是作者的属性,因此您应该将 PublisherID 引用存储在 Book 表中

Book (BookID, Name, ReleaseDate, Price, AuthorID, PublisherID)

此外,如果您将 PublisherID 存储在 Book 表中,它将只允许一个出版商,因为您需要的查询是显示每本书的“各种出版商”,您应该使用另一个表来表示该交互

BookXPublisher (BookFK, PublisherFK)

这个表只有两个外键,会这样存储数据

(1 , 1) BookID:1 && PublisherID:1
(1 , 2) BookID:1 && PublisherID:2
(3 , 1) BookID:3 && PublisherID:1

您可以为 BookXAuthor 添加另一个表以达到相同的目的

考虑到这一点,您的查询将是

SELECT b.name. p.name
FROM Books b
INNER JOIN BookXPublisher bxp ON b.BookID = bxp.BookFK
INNER JOIN Publisher p ON p.PublisherID = bxp.PublisherFK

你的桌子是这样的: 图书(BookID、名称、发行日期、价格) 发布者(PublisherID、姓名、地址) BookXPublisher (BookFK, PublisherFK)

此外,使用GROUP BY,您可以计算一个作者或一个出版商出版了多少本书

【讨论】:

以上是关于当主键在不同的表中时,可以引用两个外键吗?的主要内容,如果未能解决你的问题,请参考以下文章

做java项目时的主键和外键是啥啊?

OrmLite可以为除主键之外的属性指定外键吗

我应该使用外键在 SQL 中显示树关系吗

SQL怎么在有外键的主键表中插数据

oracle怎么查看外键在哪个表

POSTGRESQL外键引用两个不同表的主键