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
相关产品推荐
相关产品推荐

