ORA-01439: 要更改数据类型,则要修改的列必须为空

当需要将Oracle数据库中NUMBER(1)类型的LECTURER_LEVEL字段改为VARCHAR2(10)时,由于数据不为空,直接修改会报错。解决方案是创建临时字段,先将数据转移到新字段,然后删除原字段,成功实现类型转换。
摘要由CSDN通过智能技术生成

场景:原字段是NUMBER(1)类型,现在由于需求发生变化需要保存字符串数据,因此需把字段类型改成 VARCHAR2(10)。

直接修改会报错:ORA-01439: 要更改数据类型,则要修改的列必须为空

报错原因:因为要修改的字段的新类型和原来的类型不兼容,如果要修改的字段数据为空时,则可以进行字段类型的修改,而不会报这种类型的错误。

解决方案:建一个临时字段进行数据转移

  1. 修改原字段名 LECTURER_LEVEL 为 LECTURER_LEVEL_TMP。
    alter table LECTURER_INFO rename column LECTURER_LEVEL to LECTURER_LEVEL_TMP;
    
  2. 添加一个和原字段同名的新字段 LECTURER_LEVEL。
    alter table LECTURER_INFO add LECTURE_LEVEL VARCHAR2(10);
    comment on column LECTURER_INFO.LECTURER_LEVEL is '讲师等级(0未认证讲师;1助教;2初级讲师)';
    
  3. 将原字段(LECTURER_LEVEL_TMP)数据更新迁移到 新字段(LECTURER_LEVEL)中。
    update LECTURER_INFO t1
    set t1.LECTURE_LEVEL = (select t2.LECTURER_LEVEL_TMP from LECTURER_INFO t2 where t2.ID = t1.ID)
    where t1.ID in (select t3.ID from LECTURER_INFO t3);
    
  4. 更新迁移完毕,再删除原字段(LECTURER_LEVEL_TMP)即可。
    alter table LECTURER_INFO drop column LECTURER_LEVEL_TMP;
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值