Обновление записей

Для обновления записей в таблице используется оператор UPDATE. Его синтаксис:

UPDATE <Имя таблицы> SET col = newval [, col = newval ...]
    [WHERE {search-conditions}]
    [ORDER BY sort_items]
    [RETURNING <returning_list>]

Изменяемые столбцы

Изменяемые столбцы указываются в предложении SET. Столбцы и их значения перечисляются через запятую. Слева имя столбца, а справа значение или выражение.

Разрешено использовать имена столбцов в выражениях справа. При этом использоваться будет всегда старое значение столбца, даже если присваивание этому столбцу уже произошло ранее в перечислении SET. Один столбец может быть использован слева только один раз в конструкции SET.

Допустим у нас есть таблица TSET:

A

B

1

0

2

0

После выполнения оператора

UPDATE TSET SET A = 5, B = A

A

B

5

1

5

2

Обратите внимание, что старые значения (1 и 2) используются для обновления столбца B, даже после того как столбцу A были назначено новое значение (5).

Ограничение записей

Предложение WHERE ограничивает набор обновляемых записей заданным условием. Формат, синтаксис и смысл данной секции совпадает с одноименной секцией оператора SELECT.

Рассмотрим несколько примеров.

UPDATE ADDRESSES
    SET CITY = 'Saint Peterburg', CITYCODE = 'PET'
    WHERE CITY = 'Leningrad';

Здесь мы переименовали город, заменив в соответствующей строке два поля.

UPDATE EMPLOYEES
    SET SALARY = 2.5 * SALARY
    WHERE TITLE = 'CEO';

Здесь мы использовали значение поля SALARY для того, чтобы вычислить новое значение этого же поля.

UPDATE EMPLOYEE E
    SET SALARY = SALARY * 1.05
    WHERE EXISTS(SELECT * FROM EMPLOYEE_PROJECT EP WHERE E.EMP_NO = EP.EMP_NO);

В данном примере всем сотрудникам, которые заняты в каком-либо проекте, мы увеличиваем зарплату на 5%.

Получение обновленных значений

Оператор UPDATE, может включать секцию RETURNING для возврата значений из обновляемой строки. В RETURNING могут включаться любые столбцы, необязательно только те, которые обновляются.

Возвращаемые значения содержат изменения, произведённые в триггерах BEFORE, но не в триггерах AFTER. Триггеры будут рассмотрены позже.