跳到主要内容

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;
keyvalue
1original value
2original value 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;
keyvalue
1new value
2new value 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');

要提高法国所有城市的收入,可连接 citycountry 表,并按后者进行筛选:

UPDATE city
SET revenue = revenue + 100
FROM country
WHERE city.country_code = country.code
AND country.name = 'France';
SELECT *
FROM city;
namerevenuecountry_code
Paris800FR
Lyon300FR
Brussels400BE

Upsert(插入或更新)

详情见 Insert 文档