Вам действительно нужно изменить содержание столбца col1
и col4
соответствующие столбцы col2
и col3
. Вам не нужно делать никаких DML
, чтобы достичь этого, достаточно простого RENAME COLUMN
.
select Col1, Col2, Col3, Col4 from tab;
COL1 COL2 COL3 COL4
---------- ---------- ---------- ----------
1 abc 111 AAA
2 def 222 BBB
--- exchange col1 <-> col4
alter table TAB rename column col1 TO tmp;
alter table TAB rename column col4 TO col1;
alter table TAB rename column tmp TO col4;
--- exchange col2 <-> col3
alter table TAB rename column col2 TO tmp;
alter table TAB rename column col3 TO col2;
alter table TAB rename column tmp TO col3;
select Col1, Col2, Col3, Col4 from tab;
COL1 COL2 COL3 COL4
---------- ---------- ---------- ----------
AAA 111 abc 1
BBB 222 def 2
CCC 333 dhi 3
Это работает даже с различными типами столбцов .
Пример таблицы перед переименованием:
create table tab
(Col1 number,
Col2 varchar2(10),
Col3 number,
Col4 varchar2(10));
и после
CREATE TABLE TAB
("COL4" NUMBER,
"COL3" VARCHAR2(10),
"COL2" NUMBER,
"COL1" VARCHAR2(10)
);
Большим преимуществом этого подхода является то, что это только обновление метаданных, но не обновление данных в реальном времени, поэтому он готов в мгновенное время даже для больших таблиц.
Единственное, что вы должны учесть, это то, что вы не можете просто переименовать col1
в col4
, если таблица уже содержит столбец col4
. Поэтому вы должны переименовать первый столбец во временное имя, чтобы освободить целевое имя.
Единственный побочный эффект заключается в том, что порядок столбцов в таблице другой. Если это уместно, просто заново создайте таблицу с новым именем и, наконец, переименуйте исходную таблицу в резервную копию, а новую таблицу в производительное имя:
create table tab_new as
select
col4 col1,
col3 col2,
col2 col3,
col1 col4
from tab;
rename tab to backup;
rename tab_new to tab;
Вам нужно будет перенести существующие индексы, ограничения, триггеры и т. Д.