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;
| key | value |
|---|---|
| 1 | original value |
| 2 | original 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;
| key | value |
|---|---|
| 1 | new value |
| 2 | new value 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;
| name | revenue | country_code |
|---|---|---|
| Paris | 800 | FR |
| Lyon | 300 | FR |
| Brussels | 400 | BE |
Upsert(插入或更新)
详情见 Insert 文档。