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

SQL创建EQUIPMENT表外键LOAN_FK触发1776、1750报错咨询

问题原因
  • 外键引用规则不满足:SQL规范要求外键引用的父表列必须是父表的主键或具备唯一约束(候选键)。当前Loan表的主键仅为Customerid字段,EquipmentCode字段既不是主键也没有唯一约束,不满足外键引用条件,直接触发报错。
  • 外键关联逻辑完全颠倒:从业务场景看,EQUIPMENT是存储所有设备基础信息的主表,Loan是存储用户租借设备记录的流水表。合理的关联逻辑应该是Loan表的EquipmentCode作为外键引用EQUIPMENT表的主键,而非反过来让主表引用流水表。就算强行给Loan表的EquipmentCode加唯一约束绕过报错,业务上也完全不可用——同一个设备支持被多个用户在不同时段租借,Loan表的EquipmentCode必然会重复,唯一约束会导致正常的租借记录无法入库。
解决方案

调整外键的关联逻辑,将原EQUIPMENT表中的外键删除,改为在Loan表中新增EquipmentCode字段的外键关联EQUIPMENT表的主键,同时调整建表顺序,先建主表再建流水表。

修正后的建表语句

1. 创建设备主表EQUIPMENT

CREATE TABLE EQUIPMENT
(
    EquipmentCode    CHAR(5)      NOT NULL,
    EquipmentName    VARCHAR(50)  NOT NULL,
    Description      VARCHAR(255) NULL,
    RentalRatePerDay DECIMAL(4,2) NOT NULL,

    CONSTRAINT EQP_PK PRIMARY KEY(EquipmentCode),
    CONSTRAINT CHK_Rate CHECK (RentalRatePerDay BETWEEN 4 AND 50)
);

2. 创建租借流水表Loan

CREATE TABLE Loan
(
    Customerid    Char(9)  NOT NULL,
    EquipmentCode Char(5)  NOT NULL,
    StartDate     DateTime NOT NULL,
    EndDate       DateTime NULL,
    
    CONSTRAINT CHK_ID   
        CHECK (Customerid LIKE '[ST][0-9][0-9][0-9][0-9][0-9][0-9][0-9][A-Z]'),
    CONSTRAINT CHK_Date CHECK (EndDate >= StartDate),

    -- 注意:如果业务允许一个用户同时租借多台设备,这里需要修改为复合主键,例如:
    -- CONSTRAINT Loan_PK PRIMARY KEY(Customerid, EquipmentCode, StartDate)
    CONSTRAINT Loan_PK PRIMARY KEY(Customerid),

    CONSTRAINT CUST_FK 
        FOREIGN KEY(Customerid) REFERENCES CUST(CustomerID)
                ON UPDATE CASCADE
                ON DELETE CASCADE,
    -- 新增设备外键约束,关联设备主表
    CONSTRAINT EQUIPMENT_FK
        FOREIGN KEY(EquipmentCode) REFERENCES EQUIPMENT(EquipmentCode)
                ON UPDATE CASCADE
                ON DELETE CASCADE
);

内容的提问来源于stack exchange,提问作者Ang Yi Khoon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 09:48:04