У меня есть конкретный сценарий, когда мне нужно вставить два новых столбца в существующую таблицу в Oracle. Я не могу сделать снимок и воссоздать таблицу. Так может ли это быть достигнуто любыми способами?
Как вставить столбец в определенную позицию в оракуле без отбрасывания и воссоздания таблицы?
Ответ 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);
В конце таблицы будет добавлен новый столбец.