ALTER TABLE [db.]table [ON CLUSTER cluster] UPDATE column1 = expr1 [, ...] [IN PARTITION partition_id] WHERE filter_expr指定したフィルタ式に一致するデータを操作します。ミューテーションとして実装されています。
filter_expr は UInt8 型である必要があります。このクエリは、filter_expr が 0 以外の値を取る行について、指定したカラムの値を対応する式の値に更新します。値は CAST 演算子を使用してカラムの型にキャストされます。プライマリキーまたはパーティションキーの計算に使用されるカラムの更新はサポートされていません。
1 つのクエリに、カンマ区切りで複数のコマンドを含めることができます。
クエリ処理の同期性は、mutations_sync 設定で定義されます。デフォルトでは非同期です。
関連項目
- ミューテーション
- ALTER クエリの同期性
- mutations_sync 設定
- 論理更新
UPDATE- パッチパートを使用する代替の論理更新 APPLY PATCHES- 論理更新のパッチを手動で適用する
マテリアライズドカラム
更新されたカラムを参照する式を持つ MATERIALIZED カラムは、ミューテーション によって再計算されるため、保存された値は新しいデータとの整合性が保たれます。
EPHEMERAL カラムから計算されたカラム
EPHEMERAL カラムは INSERT の実行時にのみ存在し、保存されません。そのため、これを基に計算された MATERIALIZED カラムは、ミューテーションによって再計算できません。このようなカラムには 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 は 8、つまり INSERT 時に計算された値であり、2 + 7 ではありません。e の値は、それを
指定した INSERT の外部では利用できません。この理由でカラムをスキップすると、mutation は server log に警告を記録します。
このようなカラムを最新の状態にするには、影響を受ける行を再度 INSERT してください。
- ブログ記事: ClickHouse における更新と削除の処理