【问题标题】:Oracle: How to change column data type from VARCHAR to NUMBER without losing dataOracle:如何在不丢失数据的情况下将列数据类型从 VARCHAR 更改为 NUMBER
【发布时间】:2020-01-22 05:30:31
【问题描述】:

我的表格中有以下列:

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

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

【问题讨论】:

  • Oracle 的NUMBER 类型只能支持 38 位小数,因此如果不截断,您的所有数据可能无法容纳。

标签: sql oracle ddl alter-table


【解决方案1】:

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>

干杯!!

【讨论】:

    【解决方案2】:

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

    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.
    

    【讨论】:

      【解决方案3】:

      如果您的表很大,使用dbms_redefinition 会更快。这是使用它的example

      【讨论】:

        猜你喜欢
        • 2019-03-29
        • 1970-01-01
        • 2018-10-30
        • 2019-08-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多