http://blog.csdn.net/yiqijinbu/article/details/7414951
--修改INFO_CUS_COMPLEX_TAX序号类型
alter table INFO_CUS_COMPLEX_TAX add AA number;
-- Add/modify columns
alter table INFO_CUS_COMPLEX_TAX modify NO null;
--禁用约束
alter table INFO_CUS_COMPLEX_TAX disable constraint PK_INFO_COMPLEX_TAX1;
update INFO_CUS_COMPLEX_TAX set AA=NO,NO=null;
commit;
alter table INFO_CUS_COMPLEX_TAX modify NO number(4);
update INFO_CUS_COMPLEX_TAX set NO=AA,AA=null;
commit;
alter table INFO_CUS_COMPLEX_TAX drop column AA;
alter table INFO_CUS_COMPLEX_TAX modify NO not null;
--启用约束
alter table INFO_CUS_COMPLEX_TAX enable constraint PK_INFO_COMPLEX_TAX1;
问题:发现数据库出现当约束禁用/删除后,与它对应的索引并没有被删除,导致在将NO列的值赋给AA列时依然报违反唯一约束
正常情况:当约束被禁用/删除后,与它对应的索引应该会被删掉,当约束被启用/创建时,再重新创建
可能的原因:
在创建约束的时候,Oracle会自动创建对应的索引,这两者是关联的,当约束被禁用/删除时,对应的索引会被删掉,当启用/创建时,对应的索引会被创建,但是如果先建索引后建约束,即使两者的名字,关联字段一致他们也是没有关系的,看上去和上面一样,这时就会出现上面的问题。
解决办法1:判断那个索引是否存在
脚本:
declare
V_Count varchar2(2);
begin
--修改INFO_CUS_COMPLEX_TAX序号类型
execute immediate 'alter table INFO_CUS_COMPLEX_TAX add AA number';
-- Add/modify columns
execute immediate 'alter table INFO_CUS_COMPLEX_TAX modify NO null';
--禁用约束
execute immediate 'alter table INFO_CUS_COMPLEX_TAX disable constraint PK_INFO_COMPLEX_TAX1';
select count(t.status) into V_Count from user_indexes t where t.index_name='PK_INFO_COMPLEX_TAX1';
if (V_Count>0) then
execute immediate 'drop index PK_INFO_COMPLEX_TAX1';
end if;
execute immediate 'update INFO_CUS_COMPLEX_TAX set AA=NO,NO=null';
execute immediate 'alter table INFO_CUS_COMPLEX_TAX modify NO number(4)';
execute immediate 'update INFO_CUS_COMPLEX_TAX set NO=AA,AA=null';
commit;
execute immediate 'alter table INFO_CUS_COMPLEX_TAX drop column AA';
execute immediate 'alter table INFO_CUS_COMPLEX_TAX modify NO not null';
--启用约束
execute immediate 'alter table INFO_CUS_COMPLEX_TAX enable constraint PK_INFO_COMPLEX_TAX1';
end;
解决方案2:采用级联删除
alter table tvehicle drop constraint CHECK_ONLY cascade drop index;
再重新创建索引
不删除Oracle中数据的情况下,改字段类型
猜你喜欢
转载自yehlv.iteye.com/blog/2115418
今日推荐
周排行