为什么删除主键不会删除其唯一索引?
Why dropping a primary key is not dropping its unique index?
- 我有一个 table,其中
Col1
和 Col2
作为复合主键 pk_composit_key
和一个为约束自动创建的唯一索引。
- 然后我更改了 table 以添加新列
Col3
。
我删除了 pk_composit_key
约束:
改变TABLEtable_name删除约束pk_composit_key;
现在,当我尝试插入记录时,我得到了 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_constraints
或 dba_indexes
视图没有区别。不过,包括 drop index
将使它保持一致。
- 我有一个 table,其中
Col1
和Col2
作为复合主键pk_composit_key
和一个为约束自动创建的唯一索引。 - 然后我更改了 table 以添加新列
Col3
。 我删除了
pk_composit_key
约束:改变TABLEtable_name删除约束pk_composit_key;
现在,当我尝试插入记录时,我得到了
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_constraints
或 dba_indexes
视图没有区别。不过,包括 drop index
将使它保持一致。