Обновление строк таблицы.
[ WITH [ RECURSIVE ] with_query [, ...] ]
UPDATE [ONLY] table [[AS] alias]
SET {column = {expression | DEFAULT} |
(column [, ...]) = ({expression | DEFAULT} [, ...])} [, ...]
[FROM fromlist]
[WHERE condition| WHERE CURRENT OF cursor_name ]
UPDATE изменяет значение указанного столбца во всех строках, удовлетворяющих заданным критериям. Достаточно указать столбец, который вы хотите изменить, в предложении SET; столбец, который явно не изменяется, сохранит своё прежнее значение.
По умолчанию команда UPDATE обновляет строки в указанной таблице и во всех её подтаблицах. Если требуется обновить только конкретную указанную таблицу, необходимо использовать предложение ONLY.
Существует два способа изменения таблицы с использованием данных из других таблиц базы данных: использование подзапроса (subselect) или указание другой таблицы в предложении FROM. Какой из этих подходов более подходящий — зависит от конкретной ситуации.
Если указано предложение WHERE CURRENT OF, то обновляемая строка — это последняя строка, полученная из указанного курсора.
Предложение WHERE CURRENT OF не поддерживается для копии таблицы.
Для выполнения операции UPDATE необходимо иметь привилегию UPDATE на таблицу или хотя бы на те столбцы, которые вы хотите изменить. Также необходимо иметь привилегию SELECT для чтения любых столбцов, используемых в выражениях или условиях.
Примечание: По умолчанию база данных YMatrix при операции UPDATE над таблицей кучи устанавливает эксклюзивную блокировку (EXCLUSIVE lock). После включения глобального детектора взаимоблокировок режим блокировки операции UPDATE над таблицей кучи становится ROW EXCLUSIVE.
После успешного завершения команда UPDATE возвращает метку команды в следующем формате:
UPDATE count
где count — количество обновлённых строк. Если значение count равно 0, значит, не найдено ни одной строки, удовлетворяющей условиям (это не считается ошибкой).
with_query
ONLY
table
alias
column
Expression
DEFAULT
fromlist
condition
cursor_name
output_expression
output_name
Использование SET для столбца дистрибуционного ключа таблицы YMatrix запрещено.
Когда существует предложение FROM, происходит фактическое соединение целевой таблицы с таблицами, указанными в списке fromlist, и каждая выходная строка такого соединения представляет операцию обновления целевой таблицы. При использовании FROM убедитесь, что соединение даёт не более одной строки вывода для каждой строки, подлежащей изменению. Другими словами, целевая строка не должна соединяться с несколькими строками из другой таблицы. Если такое произойдёт, то для обновления будет использована только одна из строк соединения, но предсказать, какая именно, будет затруднительно.
Из-за этой неопределённости безопаснее ссылаться на другие таблицы только внутри подзапросов (subselect), хотя такой подход обычно сложнее читать и работает медленнее, чем использование соединения.
Прямое выполнение команд UPDATE и DELETE на конкретных секциях (подтаблицах) секционированных таблиц не поддерживается. Вместо этого следует выполнять эти команды на корневой таблице секционирования (таблице, созданной с помощью команды CREATE TABLE).
Изменить столбец kind в таблице films с Drama на Dramatic:
UPDATE films SET kind = 'Dramatic' WHERE kind = 'Drama';
Откорректировать значение температуры и сбросить осадки в строке таблицы weather до значения по умолчанию:
UPDATE weather SET temp_lo = temp_lo+1, temp_hi =
temp_lo+15, prcp = DEFAULT
WHERE city = 'San Francisco' AND date = '2016-07-03';
Использовать альтернативный синтаксис списка столбцов для выполнения того же обновления:
UPDATE weather SET (temp_lo, temp_hi, prcp) = (temp_lo+1,
temp_lo+15, DEFAULT)
WHERE city = 'San Francisco' AND date = '2016-07-03';
Использовать синтаксис предложения FROM для увеличения объёма продаж менеджеров, обслуживающих счёт компании Acme Corporation (предполагается, что обе связанные таблицы распределены по столбцам id в базе данных YMatrix):
UPDATE employees SET sales_count = sales_count + 1 FROM
accounts
WHERE accounts.name = 'Acme Corporation'
AND employees.id = accounts.id;
Использовать подзапросы в предложении WHERE для выполнения той же операции:
UPDATE employees SET sales_count = sales_count + 1 WHERE id =
(SELECT id FROM accounts WHERE name = 'Acme Corporation');
Попытаться добавить новые товары и их количество на склад. Если материал уже существует, обновить количество имеющегося материала. Чтобы выполнить это без прерывания всей транзакции, использовать точку сохранения.
BEGIN;
-- Other operations
SAVEPOINT sp1;
INSERT INTO wines VALUES('Chateau Lafite 2003', '24');
-- Assume the above fails because of a unique key violation,
-- so now we issue these commands:
ROLLBACK TO sp1;
UPDATE wines SET stock = stock + 24 WHERE winename = 'Chateau
Lafite 2003';
-- Continue with other operations, and eventually
COMMIT;
Данная команда соответствует стандарту SQL, однако предложение FROM является расширением базы данных YMatrix.
Согласно стандарту, синтаксис списка столбцов должен позволять присваивать список столбцов от единого выражения значения строки (например, подзапроса):
UPDATE accounts SET (contact_last_name, contact_first_name) =
(SELECT last_name, first_name FROM salesmen
WHERE salesmen.id = accounts.sales_id);
На данный момент не реализовано — источник должен быть представлен списком независимых выражений.
Некоторые другие системы баз данных предоставляют опцию FROM, при этом целевая таблица должна быть снова указана в предложении FROM. Однако база данных YMatrix интерпретирует FROM иначе. Будьте внимательны при переносе приложений, использующих такое расширение.