Oracle创建RESULT表报ORA-02270外键主键不匹配错误如何解决?
报错根因
ORA-02270报错的核心逻辑是:Oracle要求外键引用的父表列组合,必须是父表的主键,或者有单独的唯一约束。
你当前ORDERS_FOR表的主键是(OrdersForDate,OrdersForTime,O_PhysicianID,O_TestNumber,O_TestName,O_PatientID)6个字段的联合主键,你只取前两个字段OrdersForDate、OrdersForTime作为外键关联目标,这两个字段的组合在ORDERS_FOR表中没有唯一约束,也不是主键,不符合外键创建规则。
解决方案
根据你的业务需求可以选择以下两种方案:
方案1:保留你要求的RESULT表主键规则
如果业务逻辑确认ORDERS_FOR表中不会出现重复的日期+时间组合,只需要在ORDERS_FOR表的建表语句中新增OrdersForDate、OrdersForTime的唯一约束即可:
CREATE TABLE ORDERS_FOR( OrdersForDate VARCHAR(50), OrdersForTime VARCHAR(50), O_PhysicianID CHAR(5), O_TestNumber CHAR(5), O_TestName VARCHAR(45), O_PatientID CHAR(10), -- 新增日期时间唯一约束 CONSTRAINT UQ_ORDERS_FOR_DATETIME UNIQUE(OrdersForDate,OrdersForTime), CONSTRAINT Orders_ForPK_ok PRIMARY KEY(OrdersForDate,OrdersForTime,O_PhysicianID,O_TestNumber,O_TestName,O_PatientID), CONSTRAINT Orders_ForFK FOREIGN KEY(O_PhysicianID) REFERENCES PHYSICIAN(PhysicianID), CONSTRAINT Orders_ForFK_tol FOREIGN KEY(O_TestNumber,O_TestName) REFERENCES TEST(TestNumber,TestName), CONSTRAINT Orders_ForFK_toll FOREIGN KEY(O_PatientID) REFERENCES PATIENT(PatientID) );
修改后再执行RESULT表的建表语句即可正常运行。
方案2:调整表结构逻辑(更推荐)
如果业务上允许ORDERS_FOR表存在同日期同时间的多条记录,说明你原本的外键关联规则不符合业务逻辑,建议调整表设计:
- 给ORDERS_FOR表新增单字段主键,比如
OrderID CHAR(10)作为主键,替代原来的6字段联合主键,降低关联复杂度 - RESULT表新增
OrderID字段作为外键关联ORDERS_FOR表,若仍然需要日期+时间作为RESULT的主键可以保留,也可以改为关联OrderID作为主键。
其他问题说明
- 最早遇到的ORA-00955报错是因为当前数据库中已经存在同名的表/约束对象,建表前可以先执行
DROP TABLE 表名 PURGE;删除已存在的对象后再执行建表语句即可。 - 日期、时间字段不建议用VARCHAR类型存储,建议改用Oracle原生的
DATE或TIMESTAMP类型,避免非规范字符串入库,也方便后续做日期维度的计算、筛选。
内容的提问来源于stack exchange,提问作者chrisg1234
相关产品推荐
相关产品推荐

