Oracle изменить порядок столбцов в таблице

Обновлено: 04.07.2024

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

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

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

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

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

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

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

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

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

  • Групповые столбцы вместе.
  • Не столбцы NULL перед столбцами с нулевым значением.
  • Сначала часто просматривались неиндексированные столбцы.
  • Редко заполненные столбцы с нулевым значением.
  • Сначала статические столбцы.
  • Обновляемые столбцы varchar позже.
  • Индексированные столбцы после других столбцов, доступных для поиска.

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

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

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

  1. Переименуйте существующую таблицу.
  2. Отбросьте ограничение первичного ключа.
  3. Восстановите таблицу с правильным порядком столбцов.
  4. Пункт списка
  5. Запустите INSERT INTO .. ​​SELECT, чтобы переместить данные из temp в таблицу на шаге № 3.
  6. Отбросьте временную таблицу.

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

Подразумевает ли первичный ключ индекс в Oracle? Отбрасывает ли первичный ключ и индекс?

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

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

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

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

  • Сгруппируйте связанные столбцы вместе.
  • Столбцы не NULL перед столбцами, допускающими значение NULL.
  • Сначала часто просматривают неиндексированные столбцы.
  • Последние редко заполняемые столбцы, допускающие значение NULL.
  • Сначала статические столбцы.
  • Обновляемые столбцы varchar позже.
  • Индексированные столбцы после других доступных для поиска столбцов.

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

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

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

Я следовал приведенному выше решению от Джонаса, и оно работало хорошо, пока мне не понадобилось добавить второй столбец. Я обнаружил, что когда столбцы снова становятся видимыми, Oracle не обязательно делает их видимыми в порядке, указанном в операторе.

Чтобы продемонстрировать это, следуйте приведенному выше примеру Йонаса. Как он показал, после выполнения шагов таблица находится в ожидаемом порядке. Затем все ломается, когда вы добавляете еще один столбец, как показано ниже:

Пример (продолжение Йонаса):

Добавьте еще один столбец, который нужно вставить перед столбцом C.

Используйте продемонстрированную выше технику, чтобы переместить только что добавленный столбец B2 перед столбцом C.

Как показано выше, столбец C переместился в конец. Похоже, что приведенный выше оператор ALTER TABLE обработал столбцы в порядке D, E, C, а не в порядке, указанном в операторе (возможно, в физическом порядке таблицы). Чтобы столбец был размещен в нужном месте, необходимо сделать столбцы видимыми один за другим в желаемом порядке.

После выпуска Oracle 12c стало проще логически переупорядочивать столбцы.

В Oracle 12c добавлена ​​поддержка невидимости столбцов, и эту функцию можно использовать для логической перестановки столбцов.

Когда вы делаете невидимый столбец видимым, он включается в порядок столбцов таблицы как последний столбец.

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

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

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

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

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

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

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

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

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

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

После выпуска Oracle 12c стало проще логически переставлять столбцы.

В Oracle 12c добавлена ​​поддержка невидимости столбцов, и эту функцию можно использовать для логической перестановки столбцов.

Когда вы делаете невидимый столбец видимым, этот столбец включается в порядок столбцов таблицы как последний столбец.

Пример

Переместите столбец в середину:

Кредиты

Печально, что 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. Проверьте, какой код теперь недействителен, и перекомпилируйте, чтобы проверить на ошибки

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

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

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

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

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

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

Подразумевает ли первичный ключ индекс в Oracle? Отбрасывание первичного ключа также отбрасывает индекс?

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

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

Oracle имеет запрос, который выбирает существующие индексы таблицы. Например: SELECT * FROM user_indexes WHERE table_name = 'CM_WCEL'; Но мне нужно воссоздать инструкцию создания индекса. Как я могу получить оставшуюся информацию, такую как затронутые столбцы и т. д.?

У меня есть огромный запрос Oracle (

20 тысяч строк), и мне нужно перечислить все таблицы и столбцы, используемые в этом запросе. Я погуглил и нашел несколько инструментов и плагинов SQL-Parser, но они мне не подошли. Найдено ниже библиотеки perl, но она не обрабатывает столбцы TO_DATE и TO_CHAR.

С момента выпуска Oracle 12c стало проще логически переставлять столбцы.

Oracle 12c добавлена поддержка невидимости столбцов, и эта функция может быть использована для логической перестановки столбцов.

Когда вы делаете невидимый столбец видимым, он включается в порядок столбцов таблицы в качестве последнего столбца.

Читайте также: