场景:原字段是NUMBER(1)类型,现在由于需求发生变化需要保存字符串数据,因此需把字段类型改成 VARCHAR2(10)。
直接修改会报错:ORA-01439: 要更改数据类型,则要修改的列必须为空
报错原因:因为要修改的字段的新类型和原来的类型不兼容,如果要修改的字段数据为空时,则可以进行字段类型的修改,而不会报这种类型的错误。
解决方案:建一个临时字段进行数据转移
- 修改原字段名 LECTURER_LEVEL 为 LECTURER_LEVEL_TMP。
alter table LECTURER_INFO rename column LECTURER_LEVEL to LECTURER_LEVEL_TMP;
- 添加一个和原字段同名的新字段 LECTURER_LEVEL。
alter table LECTURER_INFO add LECTURE_LEVEL VARCHAR2(10); comment on column LECTURER_INFO.LECTURER_LEVEL is '讲师等级(0未认证讲师;1助教;2初级讲师)';
- 将原字段(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);
- 更新迁移完毕,再删除原字段(LECTURER_LEVEL_TMP)即可。
alter table LECTURER_INFO drop column LECTURER_LEVEL_TMP;