Как вставить столбец в определенную позицию в Oracle, не опуская и не воссоздавая таблицу? - PullRequest
21 голосов
/ 22 марта 2011

У меня есть особый сценарий, когда мне нужно вставить два новых столбца в существующую таблицу в Oracle. Я не могу сделать сброс и воссоздание таблицы. Так может ли это быть достигнуто любым способом ??

Ответы [ 4 ]

19 голосов
/ 22 марта 2011

Amit-

Я не верю, что вы можете добавить столбец в любом месте, но в конце таблицы после ее создания. Одним из решений может быть попытка этого:

CREATE TABLE MY_TEMP_TABLE AS
SELECT *
FROM TABLE_TO_CHANGE;

Удалите таблицу, в которую вы хотите добавить столбцы:

DROP TABLE TABLE_TO_CHANGE;

Это тот момент, когда вы можете перестроить существующую таблицу с нуля, добавив в столбцы, где хотите. Предположим, для этого упражнения вы хотите добавить столбцы с именами «COL2 и COL3».

Теперь вставьте данные обратно в новую таблицу:

INSERT INTO TABLE_TO_CHANGE (COL1, COL2, COL3, COL4) 
SELECT COL1, 'Foo', 'Bar', COL4
FROM MY_TEMP_TABLE;

Когда данные вставляются в вашу «новую-старую» таблицу, вы можете удалить временную таблицу.

DROP TABLE MY_TEMP_TABLE;

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

-CJ

5 голосов
/ 19 декабря 2012

Хотя это несколько устарело, я хотел бы добавить немного улучшенную версию, которая действительно меняет порядок столбцов. Вот шаги (при условии, что у нас есть таблица TAB1 со столбцами COL1, COL2, COL3):

  1. Добавить новый столбец в таблицу TAB1:
alter table TAB1 add (NEW_COL number);
  1. «Копировать» таблицу во временное имя при изменении порядка столбцов И переименовать новый столбец:
create table tempTAB1 as select NEW_COL as COL0, COL1, COL2, COL3 from TAB1;
  1. удалить существующую таблицу:
drop table TAB1;
  1. переименовать временное имя таблицы в только что удаленное имя таблицы:
rename tempTAB1 to TAB1;
5 голосов
/ 23 марта 2011

Вы (все еще) не можете выбрать положение столбца с помощью ALTER TABLE: его можно добавить только в конец таблицы. Очевидно, что вы можете выбирать столбцы в любом порядке, который хотите, поэтому, если вы не используете SELECT * FROM, порядок столбцов не должен быть большим делом.

Если вы действительно должны располагать их в определенном порядке, и вы не можете удалить и заново создать таблицу, то вы можете вместо этого удалить и воссоздать столбцы: -

Первая копия таблицы

CREATE TABLE my_tab_temp AS SELECT * FROM my_tab;

Затем удалите столбцы, которые вы хотите быть после столбца, который вы вставите

ALTER TABLE my_tab DROP COLUMN three;

Теперь добавьте новый столбец (два в этом примере) и те, которые вы удалили.

ALTER TABLE my_tab ADD (two NUMBER(2), three NUMBER(10));

Наконец, добавьте обратно данные для воссозданных столбцов

UPDATE my_tab SET my_tab.three = (SELECT my_tab_temp.three FROM my_tab_temp WHERE my_tab.one = my_tab_temp.one);

Очевидно, что ваше обновление, скорее всего, будет более сложным, и вам придется обрабатывать индексы и ограничения, и в некоторых случаях вы не сможете использовать это (столбцы больших объектов и т. Д.). Кроме того, это довольно отвратительный способ сделать это - но таблица всегда будет существовать, и вы получите столбцы в нужном вам порядке. Но так ли важен порядок столбцов?

0 голосов
/ 02 января 2019

В 12c вы можете использовать тот факт, что столбцы, которые установлены от невидимого до видимого, отображаются как последний столбец таблицы: Советы и подсказки: невидимые столбцы в базе данных Oracle 12c

Возможно, именно об этом и говорил в своем комментарии @ Jeffrey-Kemp, но ссылка там больше не работает.

Пример:

ALTER TABLE my_tab ADD (col_3 NUMBER(10));
ALTER TABLE my_tab MODIFY (
  col_1 invisible,
  col_2 invisible
);
ALTER TABLE my_tab MODIFY (
  col_1 visible,
  col_2 visible
);

Теперь col_3 будет отображаться первым в выражении SELECT * FROM my_tab.

Примечание: это не меняет физический порядок столбцов на диске, но в большинстве случаев это не то, что вы хотите делать в любом случае. Если вы действительно хотите изменить физический порядок, вы можете использовать пакет DBMS_REDEFINITION.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...