在测试环境执行某医院的升级脚本时,遇到下面的错误(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