不删除Oracle中数据的情况下,改字段类型

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;
再重新创建索引


猜你喜欢

转载自yehlv.iteye.com/blog/2115418
今日推荐