当主键位于其他表时,能否引用两个外键?外键间引用是否可行?
关于外键关联外键的查询疑问解答
嘿,咱们来一步步拆解你的问题,先从核心疑问说起,再帮你修正查询语句~
首先明确:当然允许用外键关联外键,甚至可以用任意两个表中数据类型匹配的字段做连接——只要业务逻辑上说得通。数据库并不会强制要求连接条件必须包含主键,只要字段类型兼容,且符合你要的业务逻辑,就完全没问题。
先把你的表结构再理清楚(标注主键PK和外键FK):
- Author表:
- AuthorID(PK)
- AuthorName
- Address
- TelephoneNo
- PublisherCode(FK)
- Book表:
- BookID(PK)
- Name
- ReleaseDate
- Price
- AuthorID(FK,关联
Author.AuthorID)
- Publisher表:
- PublisherID(PK)
- Name
- Address
- AuthorID(FK,关联
Author.AuthorID)
你提到的book.AuthorID = publisher.AuthorID这个连接条件,从技术和业务逻辑上都是成立的:因为这两个字段都是指向Author.AuthorID的外键,本质是把“同一作者创作的书籍”和“该作者关联的出版商”关联起来,这个逻辑如果是你要的,完全没问题。
不过看你写的查询语句,有几个明显的问题需要修正:
-- 你写的原查询 SELECT b.name, p.name FROM Books b INNER JOIN Publisher p ON b.authorID = p.publisherID GROUP BY publisherID
- 表名错误:你的书籍表是
Book,不是Books; - 连接条件错误:你写的
b.authorID = p.publisherID完全不符合你的需求——publisherID是Publisher的主键,和book.authorID的业务逻辑不相关,甚至数据类型可能都不匹配; - GROUP BY语法错误:标准SQL要求SELECT中的非聚合字段必须出现在GROUP BY里,你现在只GROUP BY
publisherID,但SELECT了b.name和p.name,会触发语法错误(MySQL宽松模式除外,但不推荐)。
下面给你两种场景的修正写法:
场景1:按出版商分组,展示每个出版商对应的所有书籍
如果你的需求是按PublisherID分组,汇总每个出版商对应的书籍列表,可以用聚合函数(比如MySQL的GROUP_CONCAT)来实现:
SELECT p.PublisherID, p.Name AS PublisherName, GROUP_CONCAT(b.Name SEPARATOR ', ') AS AssociatedBooks FROM Book b INNER JOIN Publisher p ON b.AuthorID = p.AuthorID -- 这里用你原本想的外键关联逻辑 GROUP BY p.PublisherID, p.Name;
场景2:展示每本书对应的出版商信息(不分组)
如果你只是想查询每本书对应的关联出版商,不需要分组,直接写连接即可:
SELECT b.Name AS BookName, p.Name AS PublisherName, p.PublisherID FROM Book b INNER JOIN Publisher p ON b.AuthorID = p.AuthorID;
最后再强调一遍:外键关联外键是完全合法的操作,只要业务逻辑合理,数据库不会限制这种用法~
内容的提问来源于stack exchange,提问作者Sean
相关产品推荐
相关产品推荐

