Запрос UPDATE
Запрос UPDATE изменяет значения строк в таблице.
Примеры
Для каждой строки, где i равно NULL, установите значение в 0:
UPDATE tbl SET i = 0 WHERE i IS NULL;
Установите все значения i в 1 и все значения j в 2:
UPDATE tbl SET i = 1, j = 2;
Синтаксис
UPDATE изменяет значения указанных столбцов во всех строках, удовлетворяющих условию. В SET-оператор нужно указывать только изменяемые столбцы; столбцы, не указанные явно, сохраняют свои предыдущие значения.
Обновление из другой таблицы
Таблица может быть обновлена на основе значений из другой таблицы. Это можно сделать, указав таблицу в FROM-оператор или используя подзапрос. Оба подхода позволяют выполнить операцию UPDATE в пакетном режиме для повышения производительности.
CREATE OR REPLACE TABLE original AS
SELECT 1 AS key, 'original value' AS value
UNION ALL
SELECT 2 AS key, 'original value 2' AS value;
CREATE OR REPLACE TABLE new AS
SELECT 1 AS key, 'new value' AS value
UNION ALL
SELECT 2 AS key, 'new value 2' AS value;
SELECT *
FROM original; | ключ | значение |
|---|---|
| 1 | исходное значение |
| 2 | исходное значение 2 |
UPDATE original
SET value = new.value
FROM new
WHERE original.key = new.key; Или:
UPDATE original
SET value = (
SELECT
new.value
FROM new
WHERE original.key = new.key
); SELECT * FROM original;
| ключ | значение |
|---|---|
| 1 | новое значение |
| 2 | новое значение 2 |
Обновление из той же таблицы
Единственное различие между этим случаем и предыдущим состоит в том, что для целевой таблицы и таблицы-источника должны быть указаны разные алиасы. В этом примере AS true_original и AS new обязательны.
UPDATE original AS true_original
SET value = (
SELECT
new.value || ' a change!' AS value
FROM original AS new
WHERE true_original.key = new.key
); Обновление с помощью объединений
Для выбора строк для обновления UPDATE-операторы могут использовать FROM-оператор и выражать объединения через WHERE-оператор. Например:
CREATE TABLE city (name VARCHAR, revenue BIGINT, country_code VARCHAR);
CREATE TABLE country (code VARCHAR, name VARCHAR);
INSERT INTO city VALUES ('Paris', 700, 'FR'), ('Lyon', 200, 'FR'), ('Brussels', 400, 'BE');
INSERT INTO country VALUES ('FR', 'France'), ('BE', 'Belgium'); Чтобы увеличить выручку всех городов во Франции, объедините таблицы city и country и отфильтруйте последнюю:
UPDATE city SET revenue = revenue + 100 FROM country WHERE city.country_code = country.code AND country.name = 'France';
SELECT * FROM city;
| название | выручка | код_страны |
|---|---|---|
| Париж | 800 | FR |
| Лион | 300 | FR |
| Брюссель | 400 | BE |
Upsert (Вставка или обновление)
Подробную информацию см. в документации по вставке.
© Copyright 2018–2024 Stichting DuckDB Foundation
Licensed under the MIT License.
https://duckdb.org/docs/sql/statements/update.html