⌘+k ctrl+k
1.4 (LTS)
搜索快捷键 cmd + k | ctrl + k
UPDATE 语句

UPDATE 语句用于修改表中行的数据值。

示例

对于 iNULL 的每一行,将其值设为 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;
key value
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;
key value
1 新值
2 新值 2

从同一张表更新

这种情况与上述情况的唯一区别在于,必须在目标表和源表上指定不同的表别名。在此示例中,AS true_originalAS 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
    );

使用连接(Join)进行更新

为了选择要更新的行,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');

要增加法国所有城市的收入,连接 citycountry 表,并对后者进行过滤

UPDATE city
SET revenue = revenue + 100
FROM country
WHERE city.country_code = country.code
  AND country.name = 'France';
SELECT *
FROM city;
name 收入 国家代码
巴黎 800 FR
里昂 300 FR
布鲁塞尔 400 BE

Upsert(插入或更新)

有关详细信息,请参阅 Insert 文档

© 2025 DuckDB 基金会,阿姆斯特丹,荷兰
行为准则 商标使用指南