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

Why dropping a primary key is not dropping its unique index?

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

    改变TABLEtable_name删除约束pk_composit_key;

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

    • 为什么我会收到这个错误?
    • 删除键时为什么不自动删除唯一索引?

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

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

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

您提到了导出和导入架构,如果发生在显示此行为的环境中,它会解释您所看到的内容;至少如果你使用旧版 imp 而不是数据泵 impdp.

The original import documentation 表示导入了订单对象:

Table objects are imported as they are read from the export dump file. The dump file contains objects in the following order:

  • Type definitions
  • Table definitions
  • Table data
  • Table indexes
  • Integrity constraints, views, procedures, and triggers
  • Bitmap, function-based, and domain indexes

所以唯一索引将被导入,然后约束将被创建。

When you drop a primary key constraint:

  • If the primary key was created using an existing index, then the index is not dropped.
  • If the primary key was created using a system-generated index, then the index is dropped.

由于导入顺序,约束使用现有索引,因此适用第一个项目符号;并且在删除约束时保留索引。

您可以使用 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 将使它保持一致。