В теории, можно
- переименовать столбцы быть перемещены
- добавить новые столбцы в конец списка столбцов
- копирования данных из старых колонок новых столбцов
- уронить старые столбцы
На практике я переименовал бы старый стол и воссоздал его с новым порядком столбцов. В случае необходимости, с онлайн 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;
AFAIK, no. Я уверен, что вы не можете, если в таблице есть данные. –
Порядок столбцов в реляционной таблице не имеет значения. –
@a_horse_with_no_name Логически, да, физически, нет. –