ORA-02429: 无法删除用于强制唯一/主键的索引
标签:
ora-02429错误处理ora-02429ora-02429无法删除索无法删除唯一索引无法删除主键索引 |
分类: Oracle数据库 |
一、错误信息
ORA-02429: 无法删除用于强制唯一/主键的索引

二、原因分析
在表中某个字段上建立了普通索引,再在该字段上添加唯一约束或主键约束,此时通过drop语句删除该索引,会报“ORA-02429:
无法删除用于强制唯一/主键的索引”的错误。
三、解决问题
删除该索引,意味着相关列上的约束将失效。所以,要先将相关列上的约束删除,然后再删除相关的索引。
四、示例
4.1、唯一索引示例
--创建测试表
drop table my_idx_test;
create table my_idx_test
as
select *
from user_objects
where object_id is not null
--创建普通索引
create index idx_object_id on my_idx_test(object_id);
--添加唯一约束
alter table my_idx_test add constraint uni_object_id unique(object_id);
--删掉索引,报错
drop index idx_object_id;

--先删掉唯一约束,才能删掉索引
alter table my_idx_test drop constraint uni_object_id;
drop index idx_object_id;
4.2、主键索引示例
--创建测试表
drop table my_idx_test;
create table my_idx_test
as
select *
from user_objects
where object_id is not null
--创建普通索引
create index idx_object_id on my_idx_test(object_id);
--添加主键约束
alter table my_idx_test add constraint prikey_object_id primary key(object_id);
--删掉索引,报错
drop index idx_object_id;

--先删掉主键约束,才能删掉索引
alter table my_idx_test drop constraint prikey_object_id;
drop index idx_object_id;
五、查询表的索引及约束
--查询指定表的索引情况
select t.index_name,t.index_type,t.uniqueness,t.status,t.num_rows,t.last_analyzed
from user_indexes t
where t.table_name='MY_IDX_TEST';
--查询指定表的索引引用列的情况
select t.index_name,t.column_name,t.column_position
from user_ind_columns t
where table_name='MY_IDX_TEST'
order by t.index_name,t.column_position
--查询指定表的约束情况
select r.owner,r.constraint_name,r.constraint_type,r.r_owner,r.r_constraint_name,r.status,r.last_change,r.index_owner,r.index_name
from user_constraints r
where r.table_name='MY_IDX_TEST';
ORA-02429: 无法删除用于强制唯一/主键的索引

二、原因分析
三、解决问题
删除该索引,意味着相关列上的约束将失效。所以,要先将相关列上的约束删除,然后再删除相关的索引。
四、示例
4.1、唯一索引示例
--创建测试表
drop table my_idx_test;
create table my_idx_test
as
select *
from user_objects
where object_id is not null
--创建普通索引
create index idx_object_id on my_idx_test(object_id);
--添加唯一约束
alter table my_idx_test add constraint uni_object_id unique(object_id);
--删掉索引,报错
drop index idx_object_id;

--先删掉唯一约束,才能删掉索引
alter table my_idx_test drop constraint uni_object_id;
drop index idx_object_id;
4.2、主键索引示例
--创建测试表
drop table my_idx_test;
create table my_idx_test
as
select *
from user_objects
where object_id is not null
--创建普通索引
create index idx_object_id on my_idx_test(object_id);
--添加主键约束
alter table my_idx_test add constraint prikey_object_id primary key(object_id);
--删掉索引,报错
drop index idx_object_id;

--先删掉主键约束,才能删掉索引
alter table my_idx_test drop constraint prikey_object_id;
drop index idx_object_id;
五、查询表的索引及约束
--查询指定表的索引情况
select t.index_name,t.index_type,t.uniqueness,t.status,t.num_rows,t.last_analyzed
from user_indexes t
where t.table_name='MY_IDX_TEST';
--查询指定表的索引引用列的情况
select t.index_name,t.column_name,t.column_position
from user_ind_columns t
where table_name='MY_IDX_TEST'
order by t.index_name,t.column_position
--查询指定表的约束情况
select r.owner,r.constraint_name,r.constraint_type,r.r_owner,r.r_constraint_name,r.status,r.last_change,r.index_owner,r.index_name
from user_constraints r
where r.table_name='MY_IDX_TEST';

加载中…