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 keyUPDATE test_nopk SET content = 11 WHERE id = 1;– 【报错】禁止修改主键列的值– ERROR: AnalysisException: setting expr can't be primary keyUPDATE 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.contentWHERE test_pk.id > (SELECT id FROM test_pk WHERE id = 2);
八、优化建议
·数据安全:在执行不带 WHERE 条件的 UPDATE 前,建议先用相同的条件执行 SELECT,核对受影响的数据范围。
·性能优化:对于超大规模的全表数据更新,有时重新加载数据(TRUNCATE + INSERT)可能比逐行 UPDATE 更具性能优势。