⌘+k ctrl+k
1.3 (稳定版)
搜索快捷键 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;
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_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
    );

使用连接进行更新

要选择要更新的行,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(插入或更新)

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