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

Posted

技术标签:

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

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

目标:将表UDA1中的列TEST1的类型从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;

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

【问题讨论】:

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

    备份表和索引、约束 创建表employee_bkp 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; 验证

【讨论】:

以上是关于Oracle SQL 在包含数据时将列类型从数字更改为 varchar2的主要内容,如果未能解决你的问题,请参考以下文章

Spark SQL - 从 oracle 导入时将 oracle 日期数据类型错误转换为时间戳(java.sql)

Oracle 从 varray 更改列数据类型

SQL server 数据类型 - Date VS Varchar(n)

SQL Server 2008 - 从 Float 将列更改为 Varchar 产生科学记数法

如何根据 Oracle SQL 中的某些条件将列拆分为 2?

将带有数字的列的类型从 varchar 更改为 int