在Oracle 11g中创建唯一约束时:
alter table abc add constraint uk_name unique (name);
然后还会在该列上创建唯一索引。当一个人放弃这个约束时:
alter table abc drop constraint uk_name;
然后也删除相应的索引。但是,当在约束之前单独创建索引并且稍后创建约束时 - 约束将正常工作并使用预先存在的索引,但是......当如上所述删除约束时,索引不会被删除。
现在,在执行数据库导入时,在约束之前创建索引,因此在删除约束之后,不会删除相应的索引 - 这会导致数据库的状态不同,如果有人编写了一些迁移脚本,那么它们将保留未删除状态索引,这可能会导致错误。有一种可行的解决方法,而不是:
alter table abc drop constraint uk_name;
写:
alter table abc drop constraint uk_name keep index;
drop index uk_name;
但是我想知道在保留这种约束 - 索引关系的情况下执行数据库导入是否可行以及如何实现?因此,如果在数据库A上,它认为在删除约束之后,索引将自动丢弃,而不是导入到数据库B之后应该保持相同。 Oracle数据库是如此成熟的技术,它应该是可能的,并且不需要讨厌的解决方法,是吗?
编辑:
我发现了而不是
alter table abc drop constraint uk_name keep index;
drop index uk_name;
可以写一下:
alter table abc drop constraint uk_name drop index;
这是一个不那么难看的解决方法..
答案 0 :(得分:0)
我不想重写字典,但这里有 posible 标志,可以用来知道索引是否是自动创建的:
http://jonathanlewis.wordpress.com/2012/04/19/drop-constraint/
另一种解决方法是
放弃约束
如果constriant使用的索引仍然存在于字典中 - 请将其删除