Oracle:如何在不丢失数据的情况下将列数据类型从 VARCHAR 更改为 NUMBER
Oracle: How to change column data type from VARCHAR to NUMBER without losing data
我的 table 中有以下列:
ID - NUMBER(10,0)
NUMBER - VARCHAR(255)
NUMBER
列中的所有数据都是数字。我想将 VARCHAR
类型更改为整数类型。如何做到不丢失数据?
Oracle 不允许修改不为空的列的数据类型,因此作为解决方法,您需要按照以下步骤操作
- 创建另一个数据类型为
NUMBER
的列,假设 "NUMBER1"
.
- 将
"NUMBER"
列的数据添加到新创建的列 ("NUMBER1"
) 中。
- 删除原来的
"NUMBER"
列
- 将新创建的列
"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会更快
我的 table 中有以下列:
ID - NUMBER(10,0)
NUMBER - VARCHAR(255)
NUMBER
列中的所有数据都是数字。我想将 VARCHAR
类型更改为整数类型。如何做到不丢失数据?
Oracle 不允许修改不为空的列的数据类型,因此作为解决方法,您需要按照以下步骤操作
- 创建另一个数据类型为
NUMBER
的列,假设"NUMBER1"
. - 将
"NUMBER"
列的数据添加到新创建的列 ("NUMBER1"
) 中。 - 删除原来的
"NUMBER"
列 - 将新创建的列
"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会更快