Oracle: Как изменить тип данных столбца с VARCHAR на NUMBER без потери данных - PullRequest
0 голосов
/ 22 января 2020

В моей таблице есть следующие столбцы:

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

Все данные в столбце NUMBER являются числами. Я хотел бы изменить тип VARCHAR на тип целого числа. Как это сделать без потери данных?

Ответы [ 3 ]

3 голосов
/ 22 января 2020

Oracle не позволяет изменять тип данных столбца, если он не пустой, так что в качестве обходного пути. Необходимо выполнить следующие шаги

  1. создать другой столбец с данными NUMBER типа скажем "NUMBER1".
  2. добавить данные столбца "NUMBER" в этот новый созданный столбец ("NUMBER1").
  3. Удалить исходный столбец "NUMBER"
  4. Переименуйте вновь созданный столбец "NUMBER1" в "NUMBER"

следующим образом:

Oracle setup:

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 голос
/ 22 января 2020

Если ваша таблица очень большая, было бы быстрее использовать dbms_redefinition для этого. Вот пример его использования.

1 голос
/ 22 января 2020

Этого можно добиться, выполнив следующие шаги.

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.
...