Oracle如何添加对应字段为保留字的外键约束
Oracle保留字作为字段名添加外键报错解决方案
ORA-00904报错的核心触发点是标识符匹配失败,Oracle中使用双引号包裹字段名时会严格区分大小写,必须和建表时定义的字段名大小写完全一致才会被识别,可按照以下步骤排查解决:
- 步骤1:确认两张表对应字段的实际大小写
执行以下SQL查询字段的实际定义名称:
拿到查询返回的-- 查询GAME表的目标字段名 SELECT COLUMN_NAME FROM ALL_TAB_COLUMNS WHERE TABLE_NAME = 'GAME' AND UPPER(COLUMN_NAME) = 'DATE'; -- 查询SCHEDULE表的目标字段名 SELECT COLUMN_NAME FROM ALL_TAB_COLUMNS WHERE TABLE_NAME = 'SCHEDULE' AND UPPER(COLUMN_NAME) = 'DATE';COLUMN_NAME结果后,在后续语句中严格按照该大小写用双引号包裹即可。例如查询结果为全大写DATE,则修改语句为:
如果结果为小写ALTER TABLE GAME ADD FOREIGN KEY ("DATE") REFERENCES SCHEDULE("DATE");date则使用"date",如果为混合大小写则完全匹配对应写法。 - 步骤2:确认SCHEDULE表的关联字段满足外键约束前提
外键关联的父表字段必须是主键或具备唯一约束,可通过以下语句验证:
如果返回结果中没有SELECT CONSTRAINT_TYPE FROM ALL_CONSTRAINTS WHERE TABLE_NAME = 'SCHEDULE' AND CONSTRAINT_NAME IN ( SELECT CONSTRAINT_NAME FROM ALL_CONS_COLUMNS WHERE TABLE_NAME = 'SCHEDULE' AND COLUMN_NAME = '上一步查询到的实际字段名' );P(主键)或U(唯一约束),需要先给父表字段添加唯一约束:ALTER TABLE SCHEDULE ADD CONSTRAINT UK_SCHEDULE_DATE UNIQUE ("替换为实际字段名"); - 步骤3:确认两张表的关联字段数据类型完全匹配
外键的子表和父表关联字段的数据类型、长度、精度必须完全一致,若不一致需要先统一字段类型再添加外键。
额外优化建议:业务允许的前提下,建议避免使用Oracle保留字作为字段名,可修改为
GAME_DATE、SCHEDULE_DATE等非保留字名称,无需处理大小写匹配问题,后续维护成本更低。
内容的提问来源于stack exchange,提问作者user530567
相关产品推荐
相关产品推荐

