Переупорядочить столбцы таблицы в Oracle
У меня есть таблица с 50 + столбцами, и мне нужно поменять порядок первых двух столбцов. Каков наилучший способ сделать это с помощью Oracle? Предположим, что имя таблицы ORDERDETAILS и как есть, первые два столбца: ITEM_ID и ORDER_ID. По завершении переименования имя таблицы должно быть ORDERDETAILS, но первые два столбца будут ORDER_ID и ITEM_ID. FWIW, типы столбцов и остальные столбцы и их порядок являются релевантными.
Исправьте меня, если я ошибаюсь, но я думаю, что общие шаги:
- Переименуйте существующую таблицу.
- Устранить ограничение первичного ключа.
- Повторно создайте таблицу с правильным порядком столбцов.
- Элемент списка
- Запустите INSERT INTO.. SELECT, чтобы переместить данные из temp в таблицу на шаге 3.
- Отбросьте таблицу temp.
У меня мало опыта работы с Oracle, поэтому, возможно, мне не хватает шага или двух.
Имеет ли первичный ключ индекс в Oracle? Снижает ли первичный ключ индекс?
Примеры SQL очень ценятся.
EDIT: Не искренняя благодарность тем, кто задает вопрос, почему это нужно сделать, а не оказывать помощь. Чтобы ответить на ваш вопрос о том, зачем это нужно, я выполняю приказы от кого-то, кто говорит, что мне нужно сделать это таким образом, и порядок столбцов имеет значение. Мои мысли/мнения об этом не имеют значения.
Ответы
Ответ 1
Посмотрите на пакет DBMS_Redefinition. Он будет перестраивать таблицу с новым заказом. Это можно сделать с помощью таблицы в Интернете.
Как отметил Фил Браун, тщательно подумайте, прежде чем делать это. Однако есть накладные расходы при сканировании строки для столбцов и перемещении данных при обновлении. Правила упорядочения столбцов, которые я использую (в определенном порядке):
- Групповые столбцы вместе.
- Не столбцы NULL перед столбцами с нулевым значением.
- Сначала часто просматривались неиндексированные столбцы.
- Редко заполненные столбцы с нулевым значением.
- Сначала статические столбцы.
- Обновляемые столбцы varchar позже.
- Индексированные столбцы после других столбцов, доступных для поиска.
Эти правила конфликтуют и не все были протестированы на производительность в последней версии. Большинство из них были проверены на практике, но я не документировал результаты. Варианты размещения задают одну из трех противоречащих друг другу целей: легко понять размещение столбцов; быстрый поиск данных; и минимальное перемещение данных при обновлениях.
Ответ 2
С момента выпуска Oracle 12c теперь легче логически переупорядочить столбцы.
Oracle 12c добавила поддержку для создания невидимых столбцов, и эта функция может использоваться для логического преобразования столбцов.
Цитата из документации по невидимым столбцам:
Когда вы делаете невидимый столбец видимым, столбец включается в порядок столбца таблицы как последний столбец.
Пример
Создать таблицу:
CREATE TABLE t (
a INT,
b INT,
d INT,
e INT
);
Добавить столбец:
ALTER TABLE t ADD (c INT);
Переместите столбец в середину:
ALTER TABLE t MODIFY (d INVISIBLE, e INVISIBLE);
ALTER TABLE t MODIFY (d VISIBLE, e VISIBLE);
DESCRIBE t;
Name
----
A
B
C
D
E
Кредиты
Я узнал об этом от статьи Тома Ките о новых возможностях в Oracle 12c.
Ответ 3
Печально, что Oracle этого не допускает, меня просят сделать это разработчиками все время.
Вот немного опасный, несколько быстрый и грязный метод:
- Убедитесь, что у вас достаточно места для копирования таблицы.
- Обратите внимание на любые ограничения, гранты, индексы, синонимы, триггеры, гм.. может быть, некоторые другие вещи, которые принадлежат таблице, о которых я не думал?
-
CREATE TABLE table_right_columns AS SELECT column1 column3, column2 FROM table_wrong_columns; -- Notice how we correct the position of the columns :)
-
DROP TABLE table_wrong_columns;
- 'ALTER TABLE table_right_columns RENAME TO table_wrong_columns; `
- Теперь yucky part: воссоздайте все те предметы, которые вы отметили на шаге 2 выше
- Проверьте, какой код теперь недействителен, и перекомпилируйте, чтобы проверить наличие ошибок.
И в следующий раз, когда вы создадите таблицу, рассмотрите будущие требования!;)
Ответ 4
Я следовал вышеописанному решению Джонаса, и оно работало хорошо, пока мне не понадобилось добавить второй столбец. Я обнаружил, что при повторном отображении столбцов Oracle не обязательно устанавливает их в порядке, указанном в операторе.
Чтобы продемонстрировать это, следуйте примеру Йонаса выше. Как он показал, как только шаги будут завершены, таблица будет в том порядке, который вы ожидаете. Вещи разрушаются при добавлении еще одного столбца, как показано ниже:
Пример (продолжение от Йонаса):
Добавьте еще один столбец, который должен быть вставлен перед столбцом C.
ALTER TABLE t ADD (b2 INT);
Используйте метод, показанный выше, чтобы переместить добавленный столбец B2 перед столбцом C.
ALTER TABLE t MODIFY (c INVISIBLE, d INVISIBLE, e INVISIBLE);
ALTER TABLE t MODIFY (c VISIBLE, d VISIBLE, e VISIBLE);
DESCRIBE t;
Name
----
A
B
B2
D
E
C
Как показано выше, столбец C переместился в конец. Кажется, что оператор ALTER TABLE, приведенный выше, обрабатывал столбцы в порядке D, E, C, а не в порядке, указанном в операторе (возможно, в порядке физических таблиц). Чтобы обеспечить размещение столбца в нужном месте, необходимо сделать столбцы видимыми по очереди в нужном порядке.
ALTER TABLE t MODIFY (c INVISIBLE, d INVISIBLE, e INVISIBLE);
ALTER TABLE t MODIFY c VISIBLE;
ALTER TABLE t MODIFY d VISIBLE;
ALTER TABLE t MODIFY e VISIBLE;
DESCRIBE t;
Name
----
A
B
B2
C
D
E
Ответ 5
Используйте View для ваших усилий по изменению положения столбца:
CREATE VIEW CORRECTED_POSITION
В ВИДЕ
SELECT co1_1, col_3, col_2
ОТ UNORDERDED_POSITION
должен помочь.
Эти запросы сделаны, поэтому некоторые отчеты создаются там, где они используются SELECT * FROM [table_name]. Или, у некоторых компаний есть иерархический подход к размещению информации для лучшей читаемости с обратной стороны.
Спасибо
Дилип