You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

当主键位于其他表时,能否引用两个外键?外键间引用是否可行?

关于外键关联外键的查询疑问解答

嘿,咱们来一步步拆解你的问题,先从核心疑问说起,再帮你修正查询语句~

首先明确:当然允许用外键关联外键,甚至可以用任意两个表中数据类型匹配的字段做连接——只要业务逻辑上说得通。数据库并不会强制要求连接条件必须包含主键,只要字段类型兼容,且符合你要的业务逻辑,就完全没问题。

先把你的表结构再理清楚(标注主键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
  1. 表名错误:你的书籍表是Book,不是Books;
  2. 连接条件错误:你写的b.authorID = p.publisherID完全不符合你的需求——publisherID是Publisher的主键,和book.authorID的业务逻辑不相关,甚至数据类型可能都不匹配;
  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 09:15:04