Обновление записей
Для обновления записей в таблице используется оператор 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
. Триггеры будут рассмотрены позже.