Кредит моих заметок Джо Селко:
Каждое назначение в <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 использовать.