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

如何在SQL表中创建多个外键?创建可用图书表时外键报错求助

问题分析与解决方案

错误原因

你遇到的Msg 1776错误,核心原因是外键约束的被引用字段必须是主键或带有唯一约束的候选键。你在AVAILABLE_BOOKS表中创建的FK_QUANTITY外键,引用了BOOK_INFO表的QUANTITY字段,但该字段既不是主键,也没有添加唯一约束,数据库无法确认引用关系的唯一性,因此无法创建这个外键。

另外你的表设计存在冗余问题:BOOK_INFO已经存储了图书的库存数量(且有QUANTITY>0的检查约束),没必要单独创建AVAILABLE_BOOKS表来存储可用图书,直接通过BOOK_INFO筛选即可。

修正后的表设计

如果坚持要创建AVAILABLE_BOOKS表,正确的做法是通过BOOK_ID关联BOOK_INFO,而非把QUANTITY作为外键(同一数量可能对应多本不同图书,外键这样设计无业务意义):

CREATE TABLE AVAILABLE_BOOKS
(
    BOOK_ID INT PRIMARY KEY,
    -- 若需展示库存,可通过JOIN BOOK_INFO获取,无需重复存储
    CONSTRAINT FK_AVAILABLE_BOOKS FOREIGN KEY (BOOK_ID) REFERENCES BOOK_INFO(BOOK_ID)
)

更合理的方案是用视图替代实体表,避免数据冗余:

CREATE VIEW AVAILABLE_BOOKS_VIEW
AS
SELECT BI.BOOK_ID, B.BOOK_NAME, B.BOOK_AUTHOR, BI.QUANTITY, BI.PRICE
FROM BOOK_INFO BI
JOIN BOOKS B ON BI.BOOK_ID = B.ID
WHERE BI.QUANTITY > 0

如何在一个表中创建多个外键

在一个表中创建多个外键只需为每个外键单独定义约束即可,每个外键需满足:被引用字段是目标表的主键或唯一键,且约束名唯一。

示例代码:

CREATE TABLE ORDER_DETAILS
(
    ORDER_ID INT,
    BOOK_ID INT,
    -- 复合主键
    PRIMARY KEY (ORDER_ID, BOOK_ID),
    -- 第一个外键:关联订单表
    CONSTRAINT FK_ORDER_DETAILS_ORDER FOREIGN KEY (ORDER_ID) REFERENCES ORDERS(ID),
    -- 第二个外键:关联图书信息表
    CONSTRAINT FK_ORDER_DETAILS_BOOK FOREIGN KEY (BOOK_ID) REFERENCES BOOK_INFO(BOOK_ID)
)

每个外键约束独立定义,分别指定当前表的字段、被引用表及对应字段即可。

内容的提问来源于stack exchange,提问作者Maxim Rudolovskii

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 09:31:04