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

UPDATE

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

Синтаксис

UPDATE table SET column = expression , FROM scan WHERE expression

Сканирование

Диаграмма

table ( dql ) AS name

Выражение

Диаграмма

NOT table . column literal case cast current_date to_char to_date trim NOT EXISTS ( dql ) ( dql ) ( expression , ) IS NOT NULL expression NOT BETWEEN expression AND + - * / <> != >= > <= < = NOT IN || AND OR expression

Литерал

Диаграмма

TRUE FALSE NULL decimal double integer string unsigned $ unsigned ?

Параметры

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

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

Ограничения

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

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

Примеры

Тестовые таблицы

Примеры использования команд включают в себя запросы к тестовым таблицам.

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

UPDATE warehouse SET item = 'chunks', TYPE = 'light' WHERE id = 1;

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

UPDATE warehouse SET type = 'light';

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

UPDATE orders SET amount = amount +100;

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

UPDATE items SET name = item
FROM (SELECT id AS i, item FROM orders)
WHERE id = i;

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

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