Подтвердить что ты не робот

Как вставить столбец в определенную позицию в оракуле без отбрасывания и воссоздания таблицы?

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

4b9b3361

Ответ 1

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

Ответ 2

Вы (все еще) не можете выбрать позицию столбца, используя 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);

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

Ответ 3

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

  • Добавить новый столбец в таблицу TAB1:
alter table TAB1 add (NEW_COL number);
  • "Скопировать" таблицу в имя temp при изменении порядка столбцов И переименовать новый столбец:
create table tempTAB1 as select NEW_COL as COL0, COL1, COL2, COL3 from TAB1;
  • удалить существующую таблицу:
drop table TAB1;
  • переименовать temp tablename, чтобы просто сбросить tablename:
rename tempTAB1 to TAB1;

Ответ 4

В 12c вы можете использовать тот факт, что столбцы, которые установлены как невидимые для видимых, отображаются как последний столбец таблицы: Советы и рекомендации: Невидимые столбцы в Oracle Database 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.

Ответ 5

Просто выполните следующие действия:

alter table TABLE_NAME (COLUMN_NAME      DATA_TYPE);

В конце таблицы будет добавлен новый столбец.