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
列
使用update
将NUMBER
复制到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)
SQL server 数据类型 - Date VS Varchar(n)
SQL Server 2008 - 从 Float 将列更改为 Varchar 产生科学记数法