UPDATE
语句修改表中行的值。
Examples
对于每一行,如果i
是NULL
,则将其值设置为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_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;
名称 | 收入 | 国家代码 |
---|---|---|
巴黎 | 800 | FR |
里昂 | 300 | FR |
布鲁塞尔 | 400 | BE |
Upsert (插入或更新)
详情请参阅插入文档。