为什么删除主键不会丢弃其唯一索引?

时间:2015-10-28 16:47:48

标签: oracle unique-constraint composite-primary-key

  1. 我有一个Col1Col2作为复合主键pk_composit_key的表,以及为约束自动创建的唯一索引。
  2. 然后我更改了表格以添加新列Col3
  3. 我删除了pk_composit_key约束:

    ALTER TABLE table_name DROP CONSTRAINT pk_composit_key;

  4. 现在,当我尝试插入记录时,我得到ORA-00001: unique constraint pk_composit_key violated

    • 为什么我会收到错误?
    • 当密钥被删除时,为什么不能自动删除唯一索引?

2 个答案:

答案 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_constraintsdba_indexes视图没有区别。包括drop index会使其保持一致。

答案 1 :(得分:2)

这取决于如何创建唯一索引......以下是各种方式和行为

1)首先创建唯一索引(在要定义主键的列上),然后添加主键约束。在这种情况下,添加主键的DDL将使用现有的唯一索引。因此,当您删除主键时,它不会删除索引而只删除主键。 ==>这是你的情况我猜...

2)在创建表时,您可以定义主键,或者在没有要定义主键的列的现有唯一索引时添加主键,因此系统将创建唯一索引和用它作为主键。因此,在这种情况下,当您删除主键时,唯一索引也将被删除。