В Oracle можно ли «вставить» столбец в таблицу? - PullRequest
9 голосов
/ 23 февраля 2009

При добавлении столбца в существующую таблицу Oracle всегда помещает столбец в конец таблицы. Можно ли сказать Oracle, где он должен появиться в таблице? Если да, то как?

Ответы [ 9 ]

8 голосов
/ 23 февраля 2009

Расположение столбца в таблице должно быть неважным (если не учитывать «размеры страниц» или то, что Oracle использует для хранения данных) Для потребителя важнее то, как называются результаты, т. Е. Оператор Select.

6 голосов
/ 23 февраля 2009

переименуйте YOUR_ORIGINAL_TABLE в YOUR_NEW_TABLE;

создать таблицу YOUR_ORIGINAL_TABLE nologging / * или невосстановим * / как выберите Столбец1, Столбец2, NEW_COLUMN, Столбец3 из YOUR_NEW_TABLE;

Удалить таблицу YOUR_NEW_TABLE;

Выберите * Из YOUR_ORIGINAL_TABLE; <<<<< теперь вы увидите новый столбец в середине таблицы. </p>

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

3 голосов
/ 23 февраля 2009

Почему порядок столбцов имеет значение? Вы всегда можете изменить его в своем утверждении select?

Существует преимущество добавления новых столбцов в конце таблицы. Если есть код, который наивно делает «SELECT *», а затем анализирует поля по порядку, вы не нарушите старый код, добавив новые столбцы в конце. Если вы добавите новые столбцы в середину таблицы, старый код может быть поврежден.

На одной работе у меня был администратор БД, который был супер-анальным по поводу "Никогда не делай" ВЫБРАТЬ * ". Он настаивал на том, чтобы вы всегда выписывали конкретные поля.

2 голосов
/ 24 февраля 2009

Имейте в виду, что под таблицами все данные в записях таблицы склеены. Добавление столбца в конец таблицы [если он имеет значение NULL или (в более поздних версиях) не равно NULL со значением по умолчанию) просто означает изменение метаданных таблицы. Добавление столбца в середине потребует переписывания каждой записи в этой таблице, чтобы добавить соответствующее значение (или маркеры) для этого столбца. В некоторых случаях это может означать, что записи занимают больше места на блоках, и некоторые записи необходимо перенести. Короче говоря, это огромное количество операций ввода-вывода для таблицы любого реального размера.

Вы всегда можете создать представление таблицы, в которой столбцы расположены в предпочтительном порядке, и использовать это представление в выражении DML так же, как в таблице

2 голосов
/ 23 февраля 2009

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

2 голосов
/ 23 февраля 2009

Что я обычно делаю, это:

  1. Переименуйте старую таблицу.
  2. Создайте новую таблицу со столбцами в правильном порядке.
  3. Создайте ограничения для этой новой таблицы.
  4. Заполнить данными: вставить в new_table select * из переименованной таблицы.
1 голос
/ 23 февраля 2009

Я так не считаю - SQL Server тоже не допускает этого. Метод, который я всегда должен использовать:

  1. Создать новую таблицу, которая выглядит правильно (включая дополнительный столбец
  2. Начать транзакцию
  3. выбрать все данные из старой таблицы в новую
  4. Оставить старый стол
  5. Переименовать новую таблицу
  6. Подтвердить транзакцию.

Не совсем красиво, но выполняет свою работу.

0 голосов
/ 25 мая 2010

1) Хорошо, так что вы не можете сделать это напрямую. Нам не нужно пост за постом говорить то же самое, не так ли?

2) Хорошо, так что порядок столбцов в таблице технически не имеет значения. Но не в этом суть, первоначальный вопрос просто задавался вопросом, можете ли вы сделать это или нет. Не думайте, что вы знаете требования всех остальных. Возможно, у них есть таблица из 100 столбцов, которая в настоящее время запрашивается с помощью «SELECT * ...» внутри какого-то чудовищно взломанного вместе запроса, который они просто предпочитают не пытаться распутать, не говоря уже о замене «*» на 100 имен столбцов. Или, может быть, они просто анализируют порядок вещей и им нравится иметь связанные поля рядом друг с другом при просмотре схемы с помощью, скажем, SQL Developer. Возможно, они имеют дело с нетехническим персоналом, который не узнает, что посмотреть в конце списка из 100 столбцов, когда, по логике, это должно быть где-то рядом с началом.

Нет ничего более раздражающего, чем задавать честный вопрос и получать ответ, который говорит: «Вы не должны этого делать». Это моя работа, а не твоя! Пожалуйста, не говорите мне, как делать мою работу. Просто помогите, если сможете. Спасибо!

Хорошо ... извините за напыщенную речь. Теперь ... на www.orafaq.com он предлагает этот обходной путь.

Сначала предположим, что вы уже запустили:

CREATE TABLE tab1 (col1 NUMBER);

Теперь скажите, что вы хотите добавить столбец с именем "col2", но вы хотите, чтобы они упорядочивались "col2", "col1" при выполнении операции "SELECT * FROM tbl1;"

Предлагаем запустить:

ALTER TABLE tab1 ADD (col2 DATE); ИЗМЕНИТЬ tab1 TO tab1_old; CREATE TABLE tab1 AS ВЫБРАТЬ 0 AS col1, col1 AS col2 ОТ tab1_old;

Я обнаружил, что это невероятно вводит в заблуждение. Прежде всего, вы заполняете «col1» нулями, поэтому, если у вас есть какие-либо данные, вы теряете их, делая это. Во-вторых, он на самом деле переименовывает «col1» в «col2» и не упоминает об этом. Итак, вот мой пример, надеюсь, он немного понятнее:

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

СОЗДАТЬ ТАБЛИЦУ пользователей (имя-имя varchar (25), имя-имя varchar (25));

Теперь скажите, что вы хотите вставить middle_name между first_name и last_name. Вот один из способов:

пользователи ALTER TABLE ДОБАВЛЯЮТ отчество от имени varchar (25); Переименовать пользователей в users_tmp; СОЗДАТЬ ТАБЛИЦУ пользователей, КАК ВЫБРАТЬ first_name, middle_name, last_name FROM users_tmp; / * и для хорошей меры ... * / DROP TABLE testusers_tmp;

Обратите внимание, что middle_name по умолчанию будет иметь значение NULL (подразумевается оператором ALTER TABLE). В качестве альтернативы вы можете установить другое значение по умолчанию в операторе CREATE TABLE, например:

СОЗДАТЬ ТАБЛИЦУ пользователей КАК ВЫБРАТЬ first_name, «некоторое значение по умолчанию» AS middle_name, last_name FROM users_tmp;

Этот прием может пригодиться, если вы добавляете поле даты со значением по умолчанию sysdate, но вы хотите, чтобы все существующие записи имели другое (например, более раннее) значение даты.

0 голосов
/ 23 февраля 2009

Нет, это невозможно с помощью оператора "ALTER TABLE". Однако вы можете создать новую таблицу с тем же определением, что и у вашей текущей, хотя и с другим именем, со столбцами в правильном порядке так, как вы хотите. Скопируйте данные в новую таблицу. Оставь старый стол. Переименуйте новую таблицу в соответствии со старым именем таблицы.

У Тома Кайта есть статья об этом на AskTom текст ссылки

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...