最近在将测试环境上sql语句通过flyway migrate 导入产品环境的ORALCE数据库中的时候发现出现的一个unique constrain pk_****_key violated的错误。
在实际检测的时候发现产品环境上的中一个表的主键和索引没有。添加上就好了。
后来发现产生这种现象的原因是因为我在更新测试环境中的数据库的时候,使用的是imp载入的方式,而不是使用impdp。
而通过imp命令载入数据库数据的顺序是:
1.表类型定义
2.表定义
3.表数据
4.表index
5.表约束(Integrity constraints),表视图(views),表过程和触发器(procedures, and triggers)
6.位图和域索引(Bitmap, function-based, and domain indexes);
所以在SQL语句中有删除掉主键关联的时候,
如果主键建立的时候用的是一个已经存在的索引(index),那么索引不会被删除。
如果主键建立的时候是系统生成的索引,那么索引也会同时被删除。
那么这个时候如果sql语句中有删除索引语句,就会出错。
所以如果需要有删除主键和索引的操作的话,不要用两句drop 分别删除主键和所用 而是用以下sql语句代替:
ALTER TABLE table_name DROP CONSTRAINT pk_composit_key DROP INDEX;
参考资料:https://stackoverflow.com/questions/33396877/why-didnt-dropping-a-primary-key-also-drop-its-unique-index