UPDATE 语句

最近更新时间:2026-05-06 16:28:13

我的收藏
UPDATE 语句用于修改 TCHouse-X 表中现有行的列值。

核心约束

1. 仅限主键表:目前仅支持对定义了主键(Primary Key)的内表进行 UPDATE 操作。
2. 主键不可更改SET 子句中不能包含主键列,即不支持直接更新主键的值。
3. 内表限制:仅 TCHouse-X 内表支持此操作。

语法

UPDATE [database_name.]table_name SET col = val [, col = val ... ]
[ FROM joined_table_refs ]
[ WHERE where_conditions ]

使用说明

条件过滤WHERE 子句决定了更新的范围。若省略 WHERE,则表中的所有行都会被更新。
谓词规则WHERE 子句支持与 SELECT 语句相同的复杂条件,包括子查询。
FROM 子句:通过 FROM 进行多表连接(Join),可根据关联表的匹配结果来限制待更新的行。
并发行为:
UPDATE 可与其他 DML(INSERT/UPSERT)并发运行。
由于并发执行时数据状态可能发生变化,最终受影响的行数可能与预期存在微小差异。
反馈信息:执行成功后,系统会报告受影响的行数(Modified rows)。
统计信息维护:
执行大规模更新后,务必运行 COMPUTE STATS。这对于保持执行计划的准确性、优化后续的连接查询性能至关重要。

示例

数据准备
-- 创建主键表
CREATE TABLE test_pk (id int PRIMARY KEY, content int);
INSERT INTO test_pk VALUES (1,1), (2,2), (3,3), (4,4);

-- 创建非主键表
CREATE TABLE test_nopk (id int, content int);
INSERT INTO test_nopk VALUES (1,1), (2,2), (3,3), (4,4);

常规更新与限制

-- 【推荐】基于主键更新特定行
UPDATE test_pk SET content = 11 WHERE id = 1;

-- 【报错】非主键表不支持更新
-- ERROR: AnalysisException: Currently only support update with primary key
UPDATE test_nopk SET content = 11 WHERE id = 1;

-- 【报错】禁止修改主键列的值
-- ERROR: AnalysisException: setting expr can't be primary key
UPDATE test_pk SET id = 100 WHERE id = 1;

复杂条件更新

-- 使用子查询作为 WHERE 谓词
UPDATE test_pk SET content = 34
WHERE id > (SELECT id FROM test_pk WHERE id = 2);

-- 全表更新(省略 WHERE 子句)
UPDATE test_pk SET content = 100;

带 FROM 子句的关联更新

通过连接(Join)其他表来确定更新范围:
UPDATE test_pk
SET test_pk.content = 33
FROM test_pk JOIN test_nopk ON test_pk.content > test_nopk.content
WHERE test_pk.id > (SELECT id FROM test_pk WHERE id = 2);

优化建议

数据安全:在执行不带 WHERE 条件的 UPDATE 前,建议先用相同的条件执行 SELECT,核对受影响的数据范围。
性能优化:对于超大规模的全表数据更新,有时重新加载数据(TRUNCATE + INSERT)可能比逐行 UPDATE 更具性能优势。