Переупорядочить столбцы таблицы в Oracle - PullRequest
35 голосов
/ 09 февраля 2011

У меня есть таблица с 50+ столбцами, и мне нужно поменять местами порядок первых двух столбцов.Каков наилучший способ сделать это с помощью Oracle?Предположим, что имя таблицы - ORDERDETAILS, а первые два столбца - ITEM_ID и ORDER_ID.После завершения переименования имя таблицы все равно должно быть ORDERDETAILS, но первые два столбца будут ORDER_ID и ITEM_ID.FWIW, типы столбцов и остальные столбцы и их порядок irelevent.

Исправьте меня, если я не прав, но я думаю, что общие шаги:

  1. Переименуйте существующийтаблица.
  2. Удалите ограничение первичного ключа.
  3. Повторно создайте таблицу с правильным порядком столбцов.
  4. Элемент списка
  5. Запустите INSERT INTO ..ВЫБРАТЬ, чтобы переместить данные из temp в таблицу на шаге № 3.
  6. Удалить таблицу temp.

У меня мало опыта с Oracle, поэтому, возможно, я пропускаю шаг илидва.

Означает ли первичный ключ индекс в Oracle?Удаляет ли первичный ключ также индекс?

Примеры SQL высоко ценятся.

РЕДАКТИРОВАТЬ: Не искренне спасибо тем, кто задается вопросом, зачем это нужно делать, а не предоставлять помощь.Чтобы ответить на ваш вопрос о том, почему это нужно сделать: я выполняю приказы кого-то еще, который говорит, что мне нужно сделать это таким образом, и порядок столбцов имеет значение.Мои мысли / мнения по этому поводу не имеют значения.

Ответы [ 4 ]

52 голосов
/ 30 апреля 2015

После выпуска 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 .

17 голосов
/ 09 февраля 2011

Посмотрите на пакет DBMS_Redefinition.Это восстановит таблицу с новым заказом.Это можно сделать с помощью таблицы онлайн.

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

  • Группируйте связанные столбцы вместе.
  • Не столбцы NULL перед пустыми столбцами.
  • Часто ищется в un- сначала столбцы с индексом.
  • В конце столбцы с редким заполнением.
  • Сначала статические столбцы.
  • Позже обновляемые столбцы varchar.
  • Индексированные столбцы после другихстолбцы с возможностью поиска.

Эти правила противоречат друг другу и не все были протестированы на производительность в последней версии.Большинство из них были проверены на практике, но я не документировал результаты.Варианты размещения предназначены для одной из трех противоречивых целей: простота понимания размещения столбцов;быстрый поиск данных;и минимальное перемещение данных при обновлении.

7 голосов
/ 19 июля 2012

Печально, что Oracle не позволяет этого, меня постоянно просят разработчики сделать это ..

Вот немного опасный, несколько быстрый и грязный метод:

  1. Убедитесь, что у вас достаточно места для копирования таблицы
  2. Обратите внимание на любые ограничения, гранты, индексы, синонимы, триггеры, хм ... может быть, некоторые другие вещи - которые принадлежат таблице - о которых я даже не думал?
  3. CREATE TABLE table_right_columns AS SELECT column1 column3, column2 FROM table_wrong_columns; -- Notice how we correct the position of the columns :)
  4. DROP TABLE table_wrong_columns;
  5. 'ALTER TABLE table_right_columns RENAME TO table_wrong_columns; `
  6. Теперь неприятная часть: воссоздайте все те элементы, которые выкак указано в шаге 2 выше
  7. Проверьте, какой код теперь недействителен, и перекомпилируйте для проверки на ошибки

И в следующий раз, когда вы создадите таблицу, пожалуйста, примите во внимание будущие требования!;)

0 голосов
/ 08 мая 2015

Используйте представление для ваших усилий по изменению положения столбца: CREATE VIEW CORRECTED_POSITION AS SELECT co1_1, col_3, col_2 FROM UNORDERDED_POSITION должны помочь.

Этот запрос выполняется, поэтому некоторые отчеты создаются там, где он есть.используя SELECT * FROM [имя_таблицы].Или в некоторых компаниях используется иерархический подход к размещению информации для лучшей читаемости с внутреннего интерфейса.

Спасибо, Дилип

...