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数据类型被更改而且数据也被保留了下来。
以下是修改字段名称之后的表结构