Oracle数据库Trips表外键配置失效及多列距离外键正确性问询
Oracle外键配置不生效问题排查
现有代码错误清单
- 基础语法错误:
Customer_ID NUMBER NOT NULL定义后缺少逗号,导致后续约束全部无法被正确识别 - 主键逻辑错误:
Trips_seq是序列对象,不能直接作为表字段放在主键定义中,你没有在Trips表中定义对应存储自增值的字段,序列仅用于插入数据时动态生成取值 - 外键列缺失:
Owner_ID、Payment_ID两个外键关联的字段没有在Trips表的列定义中声明,无法创建对应外键约束 - 字段命名冲突:你定义了
Payment数值字段,但外键引用时用的是不存在的Payment_ID字段,二者逻辑冲突 - 笔误错误:多列外键定义末尾多了多余字符
s,直接触发语法报错 - 执行顺序错误:你先执行
DROP SEQUENCE Trips_seq,但序列创建是在表创建之后,首次执行会触发序列不存在的报错
多列外键写法说明
你用到的多列外键关联逻辑本身是正确的,只要Distances表中存在(Destination_Town, Source_Town)的联合主键或联合唯一约束,该关联规则就可以正常生效,无法生效的原因是上述其他语法和逻辑错误。
修正后代码
-- 适配Oracle语法调整执行顺序 DROP TABLE Trips; DROP SEQUENCE Trips_seq; -- 先创建序列 CREATE SEQUENCE Trips_seq START WITH 1 INCREMENT BY 1; CREATE TABLE Trips( Trips_ID NUMBER NOT NULL, Date_of_Trip DATE NOT NULL, -- 修正字段命名和外键匹配 Payment_ID NUMBER NOT NULL, Destination_Town VARCHAR2(50) NOT NULL, Source_Town VARCHAR2 (50) NOT NULL, Customer_ID NUMBER NOT NULL, -- 补充缺失的外键关联字段 Owner_ID NUMBER NOT NULL, CONSTRAINT Trip_pk PRIMARY KEY (Trips_ID), CONSTRAINT Customer_fk FOREIGN KEY (Customer_ID) REFERENCES Customer (Customer_ID), CONSTRAINT Owner_fk FOREIGN KEY (Owner_ID) REFERENCES Vehicle_Owners (Owner_ID), CONSTRAINT Payment_fk FOREIGN KEY (Payment_ID) REFERENCES Payment (Payment_ID), CONSTRAINT Distances_fk FOREIGN KEY (Destination_Town, Source_Town) REFERENCES Distances (Destination_Town, Source_Town) );
注:如果需要用序列生成Trips_ID自增值,插入数据时写
Trips_seq.NEXTVAL作为该字段的取值即可。
内容的提问来源于stack exchange,提问作者SGA-AllStar
相关产品推荐
相关产品推荐

