7

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

TEST1目标:将表中的列类型UDA1从更改numbervarchar2

建议的方法:

  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;

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

4

4 回答 4

30
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列的最大值

于 2013-09-24T09:58:52.550 回答
15

将新列添加为 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;
于 2015-12-04T15:47:16.983 回答
6

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

  • 添加新VARCHAR2
  • 用于update复制NUMBERVARCHAR2
  • 删除NUMBER
  • 重命名VARCHAR2
于 2013-09-24T10:53:08.043 回答
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. 核实
于 2020-09-17T00:56:01.607 回答