UPDATE

Обновление строк таблицы.

Краткое описание

[ 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

  • Предложение WITH позволяет задать один или несколько подзапросов, на которые можно ссылаться по имени в запросе UPDATE.
    Для команд UPDATE, содержащих предложение WITH, оно может содержать только команды SELECT, а само предложение WITH не может содержать команды модификации данных (INSERT, UPDATE или DELETE).
    Запрос (оператор SELECT) также может содержать предложение WITH. В этом случае в запросе UPDATE могут использоваться две группы with_query, но приоритет имеют вложенные (внутренние), так как они находятся ближе по уровню вложенности.

ONLY

  • Если указано, обновляются только строки в указанной таблице. Если не указано, также обрабатываются все таблицы, унаследованные от указанной.

table

  • Имя существующей таблицы (может быть указано вместе со схемой).

alias

  • Альтернативное имя целевой таблицы. Как только задан псевдоним, фактическое имя таблицы полностью скрывается. Например, если указано UPDATE foo AS f, то в остальной части команды UPDATE на эту таблицу нужно ссылаться как на f, а не как на foo.

column

  • Имя столбца в таблице. При необходимости можно использовать имена подполей или индексы массива для уточнения имени столбца. Имя таблицы не должно включаться в спецификацию целевого столбца.

Expression

  • Выражение, присваиваемое столбцу. Это выражение может использовать старые значения данного и других столбцов таблицы.

DEFAULT

  • Установка значения столбца равным его значению по умолчанию (NULL, если явное выражение по умолчанию не задано).

fromlist

  • Список выражений таблиц, позволяющий использовать столбцы других таблиц в условиях WHERE и в выражениях обновления. Это аналогично списку таблиц, который можно указать в предложении FROM оператора SELECT. Обратите внимание, что целевая таблица не должна присутствовать в fromlist, если вы не планируете выполнить самосоединение (self-join); в этом случае целевая таблица должна быть указана в fromlist с псевдонимом.

condition

  • Выражение, возвращающее значение типа boolean. Будут обновлены только те строки, для которых результат выражения — true.

cursor_name

  • Имя курсора, используемое в условии WHERE CURRENT OF. Строка, подлежащая обновлению, — это последняя строка, полученная из этого курсора. Курсор должен представлять собой негруппирующий запрос по целевой таблице команды UPDATE. За дополнительной информацией о создании курсоров обратитесь к команде DECLARE.
    Нельзя одновременно указывать WHERE CURRENT OF и логическое условие. Обратите внимание, что нельзя одновременно указывать WHERE CURRENT OF и логическое условие. Команда UPDATE...WHERE CURRENT OF может выполняться только на сервере, например, в интерактивной сессии psql или скрипте. Языковые расширения (например, PL/pgSQL) не поддерживают обновление через курсоры.

output_expression

  • Выражение, которое вычисляется после обновления каждой строки и возвращается командой UPDATE. Это выражение может использовать любые имена столбцов одной или нескольких таблиц, перечисленных в предложении FROM. Укажите *, чтобы вернуть все столбцы.

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 иначе. Будьте внимательны при переносе приложений, использующих такое расширение.