Col1
和Col2
作为复合主键pk_composit_key
的表,以及为约束自动创建的唯一索引。 Col3
。 我删除了pk_composit_key
约束:
ALTER TABLE table_name DROP CONSTRAINT pk_composit_key;
现在,当我尝试插入记录时,我得到ORA-00001: unique constraint pk_composit_key violated
。
答案 0 :(得分:8)
您提到导出和导入架构,如果在显示此行为的环境中发生这种情况,它会解释您所看到的内容;至少如果您使用旧版imp
而不是数据泵impdp
。
The original import documentation表示已导入订单对象:
表对象在从导出转储文件中读取时导入。转储文件按以下顺序包含对象:
- 类型定义
- 表定义
- 表格数据
- 表索引
- 完整性约束,视图,过程和触发器
- 位图,基于功能和域索引
因此,将导入唯一索引,然后创建约束。
When you drop a primary key constraint:
- 如果主键是使用现有索引创建的,则不会删除索引。
- 如果使用系统生成的索引创建主键,则会删除索引。
由于导入顺序,约束是使用现有索引,因此第一个项目符号适用;并且在删除约束时保留索引。
即使没有自动创建索引,您也可以使用drop index
clause删除索引:
ALTER TABLE table_name DROP CONSTRAINT pk_composit_key DROP INDEX;
另见My Oracle Support说明370633.1;和1455492.1表明数据泵导入也会发生类似的行为。我不知道有什么方法可以检查索引是否与此级别的约束相关联;手动或自动创建索引时,dba_constraints
或dba_indexes
视图没有区别。包括drop index
会使其保持一致。
答案 1 :(得分:2)
这取决于如何创建唯一索引......以下是各种方式和行为
1)首先创建唯一索引(在要定义主键的列上),然后添加主键约束。在这种情况下,添加主键的DDL将使用现有的唯一索引。因此,当您删除主键时,它不会删除索引而只删除主键。 ==>这是你的情况我猜...
2)在创建表时,您可以定义主键,或者在没有要定义主键的列的现有唯一索引时添加主键,因此系统将创建唯一索引和用它作为主键。因此,在这种情况下,当您删除主键时,唯一索引也将被删除。