2013-06-21 3 views
2

Предположим, у меня есть эта таблица:Move оракул Column ID

enter image description here

То, что я хочу, чтобы это произошло, чтобы переместить/изменить столбец идентификатор STATUS_DT 10 и отрегулировать остальные вниз, как это:

Column Name | ID 

... 

STAT_ID  | 10 
STATUS_DT | 10 
CREA_BY  | 11 
CREA_DT  | 12 
LAST_UPD_BY | 13 
LAST_UPD_DT | 14 

Есть ли один запрос (ALTER TABLE), чтобы я мог достичь этого без повторного создания таблицы?

+0

AFAIK, no. Я уверен, что вы не можете, если в таблице есть данные. –

+5

Порядок столбцов в реляционной таблице не имеет значения. –

+3

@a_horse_with_no_name Логически, да, физически, нет. –

ответ

5

В теории, можно

  1. переименовать столбцы быть перемещены
  2. добавить новые столбцы в конец списка столбцов
  3. копирования данных из старых колонок новых столбцов
  4. уронить старые столбцы

На практике я переименовал бы старый стол и воссоздал его с новым порядком столбцов. В случае необходимости, с онлайн REORG ...

EDIT: Например:

01 INVOICE_REQUEST_ID 
    ... 
09 STAT_ID 
10 CREA_BY 
11 CREA_DT 
12 LAST_UPD_BY 
13 LAST_UPD_DT 
14 STATUS_DT 

Тогда шаг 1) переименовать столбцы быть перемещены:

ALTER TABLE my_table RENAME COLUMN crea_by  TO tmp_crea_by; 
ALTER TABLE my_table RENAME COLUMN crea_dt  TO tmp_crea_dt; 
ALTER TABLE my_table RENAME COLUMN last_upd_by TO tmp_last_upd_by; 
ALTER TABLE my_table RENAME COLUMN last_upd_dt TO tmp_last_upd_dt; 

01 INVOICE_REQUEST_ID 
... 
09 STAT_ID 
10 TMP_CREA_BY 
11 TMP_CREA_DT 
12 TMP_LAST_UPD_BY 
13 TMP_LAST_UPD_DT 
14 STATUS_DT 

Шаг 2) Добавить столбцы в конце списка столбцов:

ALTER TABLE my_table RENAME COLUMN crea_by  TO tmp_crea_by; 
ALTER TABLE my_table RENAME COLUMN crea_dt  TO tmp_crea_dt; 
ALTER TABLE my_table RENAME COLUMN last_upd_by TO tmp_last_upd_by; 
ALTER TABLE my_table RENAME COLUMN last_upd_dt TO tmp_last_upd_dt; 

01 INVOICE_REQUEST_ID 
    ... 
09 STAT_ID 
10 TMP_CREA_BY 
11 TMP_CREA_DT 
12 TMP_LAST_UPD_BY 
13 TMP_LAST_UPD_DT 
14 STATUS_DT 
15 CREA_BY 
16 CREA_DT 
17 LAST_UPD_BY 
18 LAST_UPD_DT 

Шаг 3) скопировать данные из старых колонок новых столбцов:

UPDATE my_table 
    SET tmp_crea_by  = crea_by, 
     tmp_crea_dt  = crea_dt, 
     tmp_last_upd_by = last_upd_by, 
     tmp_last_upd_dt = last_upd_dt; 

Шага 4) падение старых колонок:

ALTER TABLE my_table SET UNUSED (tmp_crea_by, tmp_crea_dt, tmp_last_upd_by, tmp_last_upd_dt); 
ALTER TABLE my_table DROP UNUSED COLUMNS; 

01 INVOICE_REQUEST_ID 
    ... 
09 STAT_ID 
10 STATUS_DT 
11 CREA_BY 
12 CREA_DT 
13 LAST_UPD_BY 
14 LAST_UPD_DT 

Если данные не имеет значения, вы можете пропустить шаги 1) переименовывать и шаг 3) копии. Сценарий будет выглядеть так:

ALTER TABLE my_table SET UNUSED (crea_by, crea_dt, last_upd_by, last_upd_dt); 
ALTER TABLE my_table ADD (crea_by  VARCHAR2(30)); 
ALTER TABLE my_table ADD (crea_dt  DATE); 
ALTER TABLE my_table ADD (last_upd_by VARCHAR2(30)); 
ALTER TABLE my_table ADD (last_upd_dt DATE); 
ALTER TABLE my_table DROP UNUSED COLUMNS; 
+0

Могу ли я поместить это в один файл, который я могу запустить непосредственно на сервер? –

+0

Да, конечно. Я только разбил его на шаги для ясности. –

+0

Ах. Я вижу, поэтому мне просто нужно поместить их все в один файл '.sql'? –