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

tips:操作不熟练的情况下记得备份相关数据

在oracle修改user表字段name类型时遇到报错:“ORA-01439:要更改数据类型,则要修改的列必须为空”,是因为要修改字段的新类型和原来的类型不兼容。

如果要修改的字段数据为空时,则不会报这种类型的错误,可以进行字段类型的修改。

alter table user modify (name varchar2(20));

要修改字段的新类型和原来的类型不兼容时,可以通过如下方式解决该问题:

1、修改原字段名name为临时字段name_new;

alter table user rename column name to name_new ;

2、添加一个新字段名称和原来字段名相同,name,类型为要修改的新类型;

alter table user add(name varcher2(50));

3、把临时字段name_new的数据更新到新添加的字段name中;

update user set name = trim(name_new);

4、删除临时字段name_new;

alter table user drop column name_new ;

实例:某软件升级提示字段类型不匹配问题可用上述方法完美解决。

根据软件升级日志发现以下sql执行报错

alter table YB_FLOW_LOG modify (receive_no NUMBER(20));

通过plsql查看该表结构receive_no为varchar2类型,需要转换成NUMBER类型,因为表中该字段存在数据,故执行报错

要么清空表字段数据,对于重要的数据在操作之前我们建议对数据进行备份。

那么怎么在不清除字段数据的情况下进行字段的数据类型更改呢?

1、修改原字段名receive_no为临时字段receive_no_new;

alter table YB_FLOW_LOG rename column receive_no to receive_no_new ;

2、添加一个新字段名称和原来字段名相同,receive_no,类型为要修改的新类型;

alter table YB_FLOW_LOG add(receive_no NUMBER(20));

3、把临时字段receive_no_new的数据更新到新添加的字段receive_no中;

update YB_FLOW_LOG set receive_no = trim(receive_no_new);

4、删除临时字段receive_no_new;

alter table YB_FLOW_LOG drop column receive_no_new ;

就这么简单,查看YB_FLOW_LOG表字段receive_no数据类型被更改而且数据也被保留了下来。

以下是修改字段名称之后的表结构

给TA买糖
共{{data.count}}人
人已赞赏
ORACLE

ORA-04031引起的数据库宕机

2020-4-26 8:13:06

ORACLE

查看oracle数据库的连接数以及用户

2020-5-16 8:33:44

⚠️
Golurending上的部份代码及教程来源于互联网,仅供网友学习交流,未经Golurending作者或上传书面授权,请勿作他用。
若您的权利被侵害,请联系站长 邮箱codesns#163.com(#-@) 或 点击右侧 私信:管理员 反馈,我们将尽快处理。
0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索