有一个表名为tb,字段段名为name,数据类型nchar(20)。
1、假设字段数据为空,则不管改为什么字段类型,可以直接执行:
alter table tb modify (name nvarchar2(20));
2、假设字段有数据,则改为nvarchar2(20)可以直接执行:
alter table tb modify (name nvarchar2(20));
3、假设字段有数据,则改为varchar2(50)执行时会弹出:“ORA-01439:要更改数据类型,则要修改的列必须为空”,这时要用下面方法来解决这个问题:
先备份
--备份
oracle用户终端执行:
exp [用户名]/[密码] tables=[表一],[表二] file=/home/oracle/table.dmp
--如果出现问题 可以恢复
oracle用户终端执行:
imp [用户名]/[密码] grants=y commit=y full=y ignore=y file=/home/oracle/table.dmp
/修改原字段名name为name_tmp/
alter table tb rename column name to name_tmp;
/增加一个和原字段名同名的字段name/
alter table tb add name varchar2(40);
/将原字段name_tmp数据更新到增加的字段name/
update tb set name=trim(name_tmp);
/更新完,删除原字段name_tmp/
alter table tb drop column name_tmp;
可以发现更改后字段变成了最后一列,介意的可参照下面的语句.
----增加一个和原字段名的辅助字段,并把值赋值过去
alter table tb add col_tmp varchar2(50);
update tb set col_tmp=trim(col) WHERE col is not null;
--赋值后,赋值原字段为null
update tb set col=null WHERE col is not null;
--修改原字段类型和值
alter table tb modify (col varchar2(50));
update tb set col=trim(col_tmp) WHERE col_tmp is not null;
--先执行上面的,执行下面的验证语句
SELECT * FROM tb WHERE col<>col_tmp;
--验证没问题后执行最后一句
alter table tb drop column col_tmp;
记得备份,oracle备份参考资料
总结:
1、当字段没有数据或者要修改的新类型和原类型兼容时,可以直接modify修改。
2、当字段有数据并用要修改的新类型和原类型不兼容时,要间接新建字段来转移。
来源:CSDN
作者:Nemo_XP
链接:https://blog.csdn.net/spw55381155/article/details/103928126