我在Oracle 11g中有一个表(包含数据),我需要使用Oracle SQLPlus来执行以下操作:
目标:将表格TEST1
中的列UDA1
类型从number
更改为varchar2
。
建议的方法:
以下不起作用。
create table temp_uda1 AS (select * from UDA1);
update UDA1 set TEST1 = null;
commit;
alter table UDA1 modify TEST1 varchar2(3);
insert into UDA1(TEST1)
select cast(TEST1 as varchar2(3)) from temp_uda1;
commit;
与索引有关(保留顺序),对吧?
答案 0 :(得分:23)
create table temp_uda1 (test1 integer);
insert into temp_uda1 values (1);
alter table temp_uda1 add (test1_new varchar2(3));
update temp_uda1
set test1_new = to_char(test1);
alter table temp_uda1 drop column test1 cascade constraints;
alter table temp_uda1 rename column test1_new to test1;
如果列上有索引,则需要重新创建它。
请注意,如果旧列中的数字大于999,则更新将失败。如果这样,您需要调整varchar
列的最大值
答案 1 :(得分:7)
将新列添加为varchar2,将数据复制到此列,删除旧列,将新列重命名为实际列名:
ALTER TABLE UDA1
ADD (TEST1_temp VARCHAR2(16));
update UDA1 set TEST1_temp = TEST1;
ALTER TABLE UDA1 DROP COLUMN TEST1;
ALTER TABLE UDA1
RENAME COLUMN TEST1_temp TO TEST1;
答案 2 :(得分:3)
查看Oracle的包DBMS_REDEFINE
。运气好的话,你可以在没有停机的情况下在线完成 - 如果需要的话。否则你可以:
VARCHAR2
列update
将NUMBER
复制到VARCHAR2
NUMBER
列VARCHAR2
列答案 3 :(得分:0)
在这里,此解决方案不会影响现有的NOT NULL或主键约束。在这里,我要将主键的类型从Number更改为VARCHAR2(3),这是示例员工表的步骤。
create table employee_bkp as select * from employee
commit;
truncate table employee
ALTER TABLE employee MODIFY employee_id varchar2(30);
insert into employee (select * from employee_bkp)
commit;