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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值