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 = 34WHERE id > (SELECT id FROM test_pk WHERE id = 2);-- 全表更新(省略 WHERE 子句)UPDATE test_pk SET content = 100;
带 FROM 子句的关联更新
通过连接(Join)其他表来确定更新范围:
UPDATE test_pkSET test_pk.content = 33FROM 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 更具性能优势。