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

Переупорядочить столбцы таблицы в Oracle

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

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

  • Переименуйте существующую таблицу.
  • Устранить ограничение первичного ключа.
  • Повторно создайте таблицу с правильным порядком столбцов.
  • Элемент списка
  • Запустите INSERT INTO.. ​​SELECT, чтобы переместить данные из temp в таблицу на шаге 3.
  • Отбросьте таблицу temp.

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

Имеет ли первичный ключ индекс в Oracle? Снижает ли первичный ключ индекс?

Примеры SQL очень ценятся.

EDIT: Не искренняя благодарность тем, кто задает вопрос, почему это нужно сделать, а не оказывать помощь. Чтобы ответить на ваш вопрос о том, зачем это нужно, я выполняю приказы от кого-то, кто говорит, что мне нужно сделать это таким образом, и порядок столбцов имеет значение. Мои мысли/мнения об этом не имеют значения.

4b9b3361

Ответ 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]. Или, у некоторых компаний есть иерархический подход к размещению информации для лучшей читаемости с обратной стороны.

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