обновить tab1 set col1 = col2, col2 = col1 - PullRequest
1 голос
/ 27 октября 2010

Как этот запрос поменяет местами данные col1 и col2 tab1? В основном, для замены нам нужна временная переменная, но здесь мы не являемся. так как это делает sql сервер?

Ответы [ 2 ]

4 голосов
/ 27 октября 2010

Только это:

UPDATE  tabl
SET     col1 = col2,
        col2 = col1

Нет DML запрос видит свой результат, чтобы избежать проблемы Хэллоуина .

Внутренне, на запись (или страницу данных) помещается блокировка UPDATE, старые значения считываются и сохраняются во временных переменных, затем блокировка повышается до EXCLUSIVE и новые значения (сохраняются в темпе). переменные) записываются в соответствующие столбцы.

0 голосов
/ 27 октября 2010

Кредит моих заметок Джо Селко:

Каждое назначение в <set clause list> выполняется параллельно, и каждое предложение SET изменяет все соответствующие строки одновременно.Или, по крайней мере, это теоретическая модель.На практике реализации сначала помечают все подходящие строки в таблице за один проход, используя предложение WHERE.Если проблем не было, механизм SQL создает копию каждой отмеченной строки в рабочем хранилище.Каждое предложение SET выполняется на основе старого изображения строки, а результаты помещаются в новое изображение строки.Наконец, старые строки удаляются, а новые строки вставляются.Если во время всего этого происходит ошибка, то система выполняет ROLLBACK, таблица остается неизменной и сообщается об ошибках.Этот параллелизм не похож на то, что вы найдете в традиционном языке программирования третьего поколения, поэтому его может быть трудно выучить.Эта функция позволяет вам написать оператор, который будет менять значения в двух столбцах, таким образом:

UPDATE MyTable
SET a = b, b = a;

Это не то же самое, что

BEGIN ATOMIC
UPDATE MyTable
SET a = b;
UPDATE MyTable
SET b = a;
END;

В первом UPDATE столбцы aи b поменяет значения в каждой строке.Во второй паре ОБНОВЛЕНИЙ столбец a получит все значения столбца b в каждой строке.Во втором ОБНОВЛЕНИИ пары a, которая теперь имеет то же значение, что и исходное значение b, будет записана обратно в столбец b - без изменений.Существуют некоторые ограничения относительно того, каким может быть выражение значения.Один и тот же столбец не может появляться более одного раза в <set clause list> - что имеет смысл, учитывая параллельный характер утверждения.Так как оба вступают в силу одновременно, вы не знаете, какое предложение SET использовать.

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