oracle添加外键失败,一例外键约束创建失败的分析及问题解决

在执行Oracle数据库的升级脚本时,遇到ORA-02270错误,指出外键约束创建失败。经过排查,发现并非数据问题,而是主表的主键索引丢失。解决方案包括创建同名索引并关联到主键约束,或禁用恢复主键约束。当遇到错误提示无法解决问题时,需深入理解原理来定位问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在测试环境执行某医院的升级脚本时,遇到下面的错误(Oracle的这个错误提示相当有欺骗性,后面细说)

ORA-02270: 此列列表的唯一关键字或主键不匹配

Alter Table 病人护理要素内容 Add Constraint 病人护理要素内容_FK_文件ID Foreign Key (文件ID) References 病人护理文件(ID) On Delete Cascade

把该SQL拷贝出来在PLSQL中运行仍然报相同的错误。

根据提示,推测可能是子表"病人护理要素内容"中存在的文件ID在父表中不存在对应主键字段的记录,查询该表却发现没有任何数据。

空表不可能存在与主表的主键不匹配的记录。

这就奇怪了,然后,检查user_cons_columns,检查主表的主键字段是否正确(是不是像创建外键SQL中的那样叫ID),没有发现问题。

再检查user_tab_cols,检查主、从表的两个字段数据类型是否一致,结果都是Number(18),仍然没有问题。

最后,检查user_indexes中主表的主键索引"病人护理文件_PK",发现没有这个索引,问题就找出来了。

原来主表的主键约束对应索引丢失了,这种情况一般是导入数据等情况导致的。

可以看到,Oracle给出的ORA-002270,很容易误导我们,以为是数据违反了唯一约束或参照完整性等情况。

后来,还发现一种情况,主键虽然有同名的索引,但是却没有跟主键约束关联起来,用下面的SQL查询,查出的索引名列为空:

select index_name from user_constra

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值