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

Oracle: How to change column data type from VARCHAR to NUMBER without losing data

我的 table 中有以下列:

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

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>

干杯!!

您可以通过执行以下步骤来实现。

1. Add new column NUMBER1 with type integer.
2. Update table set NUMBER1=TO_NUMBER(NUMBER);
3. Remove column NUMBER.
4. Rename column NUMBER1 to NUMBER.

如果你的table很大,用dbms_redefinition to do it. Here's an example会更快