问题
表A有数据,想修改其中有一列A1为VARCHAR2(10)型(原来为NUMBER型)。
当时开始执行sql
alter table A modify (A1 varchar2(10));
结果报错了
SQL> alter table A modify (A1 varchar2(10));
alter table A
modify(A1 varchar2(10))
ORA-01439: 要更改数据类型,则要修改的列必须为空
A1中是有数据的,我不想破坏原来的数据,只想修改列类型。
解决方法
网上找到的方法
create table bbb as select * from aaa where 1=2;
alter table bbb modify (a1 varchar2(32));
insert into bbb select * from aaa;
drop table aaa;
rename table bbb to aaa;
个人不太喜欢,要对整个表操作,不值后来用以下的方法 ,要oralce 9i以上的版本才可以。
--#alter table fyt_ntj_table7 modify( dzdx varchar2(10));
--1.添加列add(newColumn varchar2(10))
alter table fyt_ntj_table7 add(newColumn varchar2(10));
--2.赋值newColumn = dzdx
update fyt_ntj_table7 set newColumn = dzdx;
commit;
--3.删除原来的列和列的约束drop column dzdx
alter table fyt_ntj_table7 drop column dzdx CASCADE CONSTRAINTS;
--4.重命名newColumn to dzdx
alter table fyt_ntj_table7 rename column newColumn to dzdx;
还是有问题的,不能做为一个事务去处理。
如果中间的update 没成功,就把第三步删除列给X了,就惨了,所以要做这一列的副本列。。。保险啊。。