ALTER TABLE ... UPDATE
ALTER TABLE ... UPDATE
지정된 필터링 표현식과 일치하는 데이터를 조작해요. mutation으로 구현됩니다.
출처: 문서
본문
ALTER TABLE [db.]table [ON CLUSTER cluster] UPDATE column1 = expr1 [, ...] [IN PARTITION partition_expr1 [, partition_expr2 ...]] WHERE filter_expr
지정된 필터링 표현식과 일치하는 데이터를 조작해요. mutation으로 구현됩니다.
ALTER TABLE 접두사는 이 문법을 SQL을 지원하는 대부분의 다른 시스템과 다르게 만들어요. OLTP 데이터베이스의 유사한 쿼리와 달리, 이것은 잦은 사용을 위한 것이 아닌 무거운(heavy) 연산임을 나타내기 위한 것이에요.
filter_expr는 UInt8 타입이어야 해요. 이 쿼리는 filter_expr가 0이 아닌 값을 취하는 행에서 지정된 컬럼의 값을 해당 표현식의 값으로 업데이트해요. 값은 CAST 연산자로 컬럼 타입으로 변환됩니다. 기본 키나 파티션 키 계산에 사용되는 컬럼의 업데이트는 지원되지 않아요.
하나의 쿼리는 쉼표로 구분된 여러 개의 명령을 포함할 수 있어요.
IN PARTITION 절은 mutation을 나열된 파티션으로 제한해요. 이것이 없으면 ReplicatedMergeTree 계열 테이블에서 optimize_mutations_with_partition_pruning 설정(기본값)이 활성화되어 있을 때, ClickHouse가 filter_expr 안의 파티션 키 조건을 자동으로 감지하여 영향을 받는 파티션만 변형해요. 비복제 MergeTree 테이블에서는 mutation을 특정 파티션으로 제한하려고 명시적인 IN PARTITION 절을 사용해야 합니다.
쿼리 처리의 동기성은 mutations_sync 설정에 의해 결정돼요. 기본적으로 비동기적으로 동작합니다.
참고하세요.
- Mutations
- Synchronicity of ALTER Queries
- mutations_sync 설정
- Lightweight
UPDATE- patch 파트를 사용하는 대체 가벼운 업데이트 APPLY PATCHES- 가벼운 업데이트의 patch를 수동으로 적용
Materialized columns
업데이트된 컬럼을 읽는 MATERIALIZED 컬럼은 mutation에 의해 다시 계산되므로, 저장된 값이 새 데이터와 일관되게 유지돼요.
Columns calculated from EPHEMERAL columns
EPHEMERAL 컬럼은 INSERT 기간 동안만 존재하고 저장되지 않으므로, 그걸로 계산된 MATERIALIZED 컬럼은 mutation으로 다시 계산할 수 없어요. 그런 컬럼은 INSERT 시점에 계산된 값을 유지하는데, 그러면 더 이상 그 표현식과 일치하지 않게 됩니다:
CREATE TABLE test
(
x Int32,
e Int32 EPHEMERAL 0,
m Int32 MATERIALIZED x + e
)
ENGINE = MergeTree
ORDER BY tuple();
INSERT INTO test (x, e) VALUES (1, 7);
ALTER TABLE test UPDATE x = 2 WHERE 1;
SELECT x, m FROM test;
┌─x─┬─m─┐
│ 2 │ 8 │
└───┴───┘
m은 INSERT 중에 계산된 값인 8이고, 2 + 7이 아니에요. e의 값은 그것을 제공한 INSERT 밖에서는 사용할 수 없기 때문입니다. mutation은 이런 이유로 컬럼을 건너뛸 때 서버 로그에 경고를 써요. 그러한 컬럼을 최신 상태로 만들려면 영향을 받은 행을 다시 INSERT하세요.