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, типы столбцов и остальные столбцы и их порядок не имеют значения.
Поправьте меня, если я ошибаюсь, но я думаю, что общие шаги следующие:
- Переименуйте существующую таблицу.
- Отбросьте ограничение первичного ключа.
- Восстановите таблицу с правильным порядком столбцов.
- Пункт списка
- Запустите INSERT INTO .. SELECT, чтобы переместить данные из temp в таблицу на шаге № 3.
- Отбросьте временную таблицу.
У меня мало опыта работы с 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 не позволяет этого, меня постоянно просят разработчики ..
Вот немного опасный, несколько быстрый и грязный метод:
- Убедитесь, что у вас достаточно места для копирования таблицы
- Обратите внимание на какие-либо ограничения, гранты, индексы, синонимы, триггеры, хм . может быть, некоторые другие вещи - которые относятся к таблице - о которых я не думал?
- 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; `
- Теперь отвратительная часть: воссоздайте все те предметы, которые вы отметили в шаге 2 выше.
- Проверьте, какой код теперь недействителен, и перекомпилируйте, чтобы проверить на ошибки
И в следующий раз, когда вы создадите таблицу, учтите будущие требования! ;)
Используйте 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 добавлена поддержка невидимости столбцов, и эта функция может быть использована для логической перестановки столбцов.
Когда вы делаете невидимый столбец видимым, он включается в порядок столбцов таблицы в качестве последнего столбца.
Читайте также: