Ответ 1
Обычный способ - использовать UPDATE:
UPDATE mytable
SET new_column = <expr containing old_column>
Вы должны иметь возможность сделать это - одна транзакция.
У меня есть таблица с большим количеством записей (может быть более 500 000 или 1 000 000). Я добавил новый столбец в этой таблице, и мне нужно заполнить значение для каждой строки в столбце, используя соответствующее значение строки другого столбца в этой таблице.
Я попытался использовать отдельные транзакции для выбора каждого следующего фрагмента из 100 записей и обновления значения для них, но все же это занимает несколько часов, чтобы обновить все записи в Oracle10, например.
Каков наиболее эффективный способ сделать это в SQL, не используя некоторые специфичные для диалекта функции, поэтому он работает повсюду (Oracle, MSSQL, MySQL, PostGre и т.д.)?
ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ: нет вычисленных полей. Есть индексы. Используемые сгенерированные операторы SQL, которые обновляют таблицу по строкам.
Обычный способ - использовать UPDATE:
UPDATE mytable
SET new_column = <expr containing old_column>
Вы должны иметь возможность сделать это - одна транзакция.
Как говорит Марсело:
UPDATE mytable
SET new_column = <expr containing old_column>;
Если это происходит слишком долго и не удается из-за слишком старых снимков "моментального снимка" (например, если выражение запрашивает другую высокоактивную таблицу), и если новое значение для столбца всегда равно NULL, вы можете обновить таблицу в партии:
UPDATE mytable
SET new_column = <expr containing old_column>
WHERE new_column IS NULL
AND ROWNUM <= 100000;
Просто запустите этот оператор, COMMIT, а затем запустите его снова; rinse, повторите, пока не сообщит "Обновлено 0 строк". Это займет больше времени, но каждое обновление будет менее вероятным.
Вы можете удалить любые индексы в таблице, затем внести свою вставку и затем воссоздать индексы.
Можете не работать, но метод, который я использовал пару раз в прошлом для подобных обстоятельств.
created updated_ {table_name}, затем выберите вставку в эту таблицу пакетами. После этого, и это зависит от Oracle (который я не знаю и не использую), поддерживающего возможность переименования таблиц в атомном режиме. updated_ {table_name} становится {table_name}, а {table_name} становится оригинальным_ {table_name}.
В прошлый раз я должен был сделать это для сильно индексированной таблицы с несколькими миллионами строк, которые абсолютно невозможно заблокировать на время, необходимое для внесения в нее серьезных изменений.
Что такое версия базы данных? Проверьте виртуальные столбцы в 11g:
Добавление столбцов со значением по умолчанию http://www.oracle.com/technology/pub/articles/oracle-database-11g-top-features/11g-schemamanagement.html