【问题标题】:Oracle SQL to change column type from number to varchar2 while it contains dataOracle SQL 在包含数据时将列类型从数字更改为 varchar2
【发布时间】:2013-09-24 09:51:48
【问题描述】:

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

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

建议方法:

  1. 备份表
  2. 将列设置为空
  3. 更改数据类型
  4. 恢复值

以下操作无效。

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;

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

【问题讨论】:

  • 您最后的insert 语句必须是update
  • 另外,有人告诉我“表有一个密钥”我需要用密钥导出......然后用匹配的密钥恢复。是这样吗?
  • “有人告诉我桌子有钥匙”是什么意思……你认识桌子吗?
  • 是的,它是一个大表,所以我应该只在第一步中备份列 TEST1。如果是这样,最后一步怎么办?
  • 参考@a_horse_with_no_name 的答案,这是正确的程序。记得创建索引。由于 number 和 varchar2 不同,所以不会有相同的顺序

标签: sql oracle oracle11g


【解决方案1】:
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 列的最大值

【讨论】:

  • 你在这里做什么? alter table temp_uda1 add (test1_new varchar2(3));
  • ^ 不应该是:alter table UDA1 modify TEST1 VARCHAR2(3);我想更改上一列,而不是添加新列..
  • @Din:你为什么不一个接一个地运行一个语句并在每一步之后检查那个表。然后你就会明白每个语句在做什么。
【解决方案2】:

将新列添加为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;

【讨论】:

    【解决方案3】:

    查看 Oracle 的包DBMS_REDEFINE。运气好的话,您可以在不停机的情况下在线完成 - 如果需要。否则你可以:

    • 添加新的VARCHAR2
    • 使用updateNUMBER 复制到VARCHAR2
    • 删除NUMBER
    • 重命名VARCHAR2

    【讨论】:

      【解决方案4】:

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

      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. 验证

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-11-06
        • 1970-01-01
        • 2018-02-20
        • 2012-11-04
        • 2010-10-06
        • 1970-01-01
        • 2014-02-23
        • 1970-01-01
        相关资源
        最近更新 更多