Spec-Zone.ru › DuckDB

Запрос 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API