Oracle:如何在不丢失数据的情况下将列数据类型从VARCHAR更改为NUMBER

问题描述 投票:0回答:1

我的数据库中有以下字段:

  • ID-NUMBER(10,0)
  • NUMBER-VARCHAR(255)

[NUMBER列中的所有数据都是数字。我想将VARCHAR类型更改为Integer NUmber类型。如何做到没有数据丢失?

sql database oracle field alter-table
1个回答
0
投票

Oracle不允许修改该列的数据类型,如果它不是空的,这是一种解决方法,您需要执行以下步骤

  1. 创建另一个具有NUMBER数据类型的列,比方说"NUMBER1"
  2. "NUMBER"列的数据添加到新创建的列("NUMBER1")。
  3. 删除原始的"NUMBER"
  4. 将新创建的列"NUMBER1"重命名为"NUMBER"

如下:

Oracle设置:

SQL> CREATE TABLE YOUR_TABLE (
  2      ID         NUMBER(10, 0),
  3      "NUMBER"   VARCHAR(255)
  4  );

Table created.


SQL> DESC YOUR_TABLE;
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 ID                                                 NUMBER(10)
 NUMBER                                             VARCHAR2(255)

SQL> INSERT INTO YOUR_TABLE VALUES (1,'1');

1 row created.

SQL> COMMIT;

Commit complete.

如果直接更改列数据类型,则显示错误:

SQL> ALTER TABLE YOUR_TABLE MODIFY "NUMBER" NUMBER;
ALTER TABLE YOUR_TABLE MODIFY "NUMBER" NUMBER
                              *
ERROR at line 1:
ORA-01439: column to be modified must be empty to change datatype

解决方案:

SQL> ALTER TABLE YOUR_TABLE ADD "NUMBER1" NUMBER;

Table altered.

SQL>
SQL> UPDATE YOUR_TABLE
  2  SET "NUMBER1" = "NUMBER";

1 row updated.

SQL>
SQL> ALTER TABLE YOUR_TABLE DROP COLUMN "NUMBER";

Table altered.

SQL>
SQL> ALTER TABLE YOUR_TABLE RENAME COLUMN "NUMBER1" TO "NUMBER";

Table altered.

SQL> DESC YOUR_TABLE;
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 ID                                                 NUMBER(10)
 NUMBER                                             NUMBER

SQL>

干杯!

© www.soinside.com 2019 - 2024. All rights reserved.