日期:2014-05-16  浏览次数:20377 次

Oracle 级联删除约束后索引对象仍然存在

Oracle 数据库里可能因索引与约束建立的依赖关系不同,在级联删除约束后索引对象可能仍然存在

?

示例: ?

?

-- 建表

?

?

create table test_tmp

as

select rownum as task_id  from dual connect by rownum <= 10 ;  
?

?

-- 先建立索引

create unique index PK_TASK_ID on test_tmp(task_id); 
?

?

?

-- 再在基于此索引建立主键约束

alter table test_tmp add constraint PK_TASK_ID  primary key (task_id) using index PK_TASK_ID; 
?

?

?

?

-- 级联删除约束

alter table test_tmp drop constraint PK_TASK_ID cascade ; 
?

?

?

-- 此时发现仅仅只删除了主键约束,索引却保留了下来

select * from all_objects t where t.object_name= 'PK_TASK_ID' ; -- 索引返回

select * from all_constraints t where t.constraint_name= 'PK_TASK_ID' ; -- 无结果 
?

?

-- 解决办法,无论索引是否事先存在都可以成功执行

alter table test_tmp drop constraint PK_TASK_ID cascade drop index ;
?

?


有时在丢掉约束后,发现主键字段依然保持着非空属性,这也意味约束建立之前,此字段被设置成了非空;若索引是基于主键约束而生成的,那直接删除约束后索引与非空属性也随即丢掉了

?

?

?

?

?

?

?

?

?

?

?

?

?