UPDATE¶
DML-команда UPDATE используется для обновления данных в
колонках таблицы. При использовании фильтрующего условия (WHERE) можно
применять ее только к определенным кортежам таблицы. В то время как для
полной замены кортежей можно использовать команду INSERT c параметром
on conflict do replace, команда UPDATE подойдет для выборочной
замены значений отдельных колонок в нужных кортежах. В качестве
источника данных для UPDATE можно использовать как непосредственно
передаваемые значения, так и результат подзапроса в конструкции FROM
(SELECT ...).
Синтаксис¶
Сканирование¶
Диаграмма
Выражение¶
Диаграмма
Литерал¶
Диаграмма
Параметры¶
-
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) для того, чтобы каждому кортежу
первой таблицы соответствовал ровно один кортеж второй таблицы.
В каждом случае результатом успешного выполнения будет сообщение с количеством обработанных кортежей.