日期:2014-05-16 浏览次数:20384 次
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 ;?
?
有时在丢掉约束后,发现主键字段依然保持着非空属性,这也意味约束建立之前,此字段被设置成了非空;若索引是基于主键约束而生成的,那直接删除约束后索引与非空属性也随即丢掉了
?
?
?
?
?
?
?
?
?
?
?
?
?