Перейти к содержанию

UPDATE

DML-команда UPDATE используется для обновления данных в колонках таблицы. При использовании фильтрующего условия (WHERE) можно применять ее только к определенным кортежам таблицы. В то время как для полной замены кортежей можно использовать команду INSERT c параметром on conflict do replace, команда UPDATE подойдет для выборочной замены значений отдельных колонок в нужных кортежах. В качестве источника данных для UPDATE можно использовать как непосредственно передаваемые значения, так и результат подзапроса в конструкции FROM (SELECT ...).

Синтаксис

UPDATE table SET column = expression , FROM ( select values ) AS name WHERE expression

Выражение

Диаграмма

table . column expression IS NOT NULL OR AND * / + - = > < >= <= <> != expression NOT BETWEEN expression AND expression IN ( select values ) NOT EXISTS ( select values ( select values expression , ) literal cast NOT expression

Литерал

Диаграмма

TRUE FALSE NULL ? $ unsigned integer double decimal string

Параметры

  • TABLE — имя таблицы. Соответствует правилам имен для всех объектов в кластере.

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

Ограничения

При использовании UPDATE следует учитывать следующие ограничения:

  • нельзя обновить значение первичного ключа (например, id)
  • нельзя указать одну и ту же колонку дважды (например, name = 'Duke', name = 'Nukem')
  • нельзя обновить значение в системной колонке bucket_id (оно вычисляется автоматически)
  • передаваемое новое значение не должно противоречить типу данных, присвоенному колонке

Примеры

Обновление явно указанных данных в отдельном кортеже с использованием условия:

UPDATE characters SET name = 'Etch', year = 2010 WHERE id = 2;

Обновление всех значений в колонке:

UPDATE characters SET year = 2010;

Обновление с помощью ссылки на существующую колонку таблицы (без необходимости использовать подзапрос):

UPDATE characters SET year = year + 1;

Обновление значений колонки на основе значений другой колонки (с подзапросом):

UPDATE characters SET name = item
FROM (SELECT id AS i, name AS item FROM assets)
WHERE id = i;

В данном случае использования подзапроса (FROM (SELECT ...)), потребуется указать и фильтр (WHERE) для того, чтобы каждом кортеже первой таблицы соответствовала ровно один кортеж второй таблицы.

В каждом случае результатом успешного выполнения будет сообщение с количеством обработанных кортежей. Например:

---
- row_count: 10
...