Oracle SQL在包含数据时将列类型从数字更改为varchar2

时间:2013-09-24 09:51:48

标签: sql oracle oracle11g

我在Oracle 11g中有一个表(包含数据),我需要使用Oracle SQLPlus来执行以下操作:

目标:将表格TEST1中的列UDA1类型从number更改为varchar2

建议的方法:

  1. 备份表
  2. 将列设置为null
  3. 更改数据类型
  4. 恢复值
  5. 以下不起作用。

    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;
    

    与索引有关(保留顺序),对吧?

4 个答案:

答案 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
  • 使用updateNUMBER复制到VARCHAR2
  • 删除NUMBER
  • 重命名VARCHAR2

答案 3 :(得分:0)

在这里,此解决方案不会影响现有的NOT NULL或主键约束。在这里,我要将主键的类型从Number更改为VARCHAR2(3),这是示例员工表的步骤。

  1. 备份表和索引,约束 创建表employee_bkp create table employee_bkp as select * from employee commit;
  2. 截断表格以清空它 truncate table employee
  3. 更改表以更改类型 ALTER TABLE employee MODIFY employee_id varchar2(30);
  4. 从备份表复制回数据 insert into employee (select * from employee_bkp) commit;
  5. 验证