⌘+k ctrl+k
1.1.3 (stable)
Search Shortcut cmd + k | ctrl + k
UPDATE Statement

UPDATE 语句修改表中行的值。

Examples

对于每一行,如果iNULL,则将其值设置为0:

UPDATE tbl
SET i = 0
WHERE i IS NULL;

i的所有值设置为1,并将j的所有值设置为2:

UPDATE tbl
SET i = 1, j = 2;

Syntax

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 (插入或更新)

详情请参阅插入文档