> ## Documentation Index
> Fetch the complete documentation index at: https://private-7c7dfe99-parallel-read-in-order-multi-part.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

> ALTER TABLE ... UPDATE 文に関するドキュメント

# ALTER TABLE ... UPDATE

```sql theme={null}
ALTER TABLE [db.]table [ON CLUSTER cluster] UPDATE column1 = expr1 [, ...] [IN PARTITION partition_expr1 [, partition_expr2 ...]] WHERE filter_expr
```

指定したフィルタ式に一致するデータを操作します。[ミューテーション](/ja/reference/statements/alter/index#mutations)として実装されています。

<Note>
  `ALTER TABLE` プレフィックスが付くため、この構文は SQL をサポートする他の多くのシステムとは異なります。これは、OLTP データベースの類似クエリとは異なり、頻繁な使用を想定していない高コストな操作であることを示すためのものです。
</Note>

`filter_expr` は `UInt8` 型である必要があります。このクエリは、`filter_expr` が 0 以外の値を取る行について、指定したカラムの値を対応する式の値に更新します。値は `CAST` 演算子を使用してカラムの型にキャストされます。プライマリキーまたはパーティションキーの計算に使用されるカラムの更新はサポートされていません。

1 つのクエリに、カンマ区切りで複数のコマンドを含めることができます。

`IN PARTITION` 句は、ミューテーションの対象を列挙したパーティションに限定します。これを指定しない場合、`ReplicatedMergeTree` ファミリーのテーブルでは、[optimize\_mutations\_with\_partition\_pruning](/ja/reference/settings/session-settings/optimize) 設定が有効(デフォルト)であれば、ClickHouse が `filter_expr` 内のパーティションキー条件を自動的に検出し、影響を受けるパーティションのみをミューテーションします。レプリケーションされていない `MergeTree` テーブルでは、ミューテーションを特定のパーティションに限定するために明示的な `IN PARTITION` 句を使用してください。

クエリ処理の同期性は、[mutations\_sync](/ja/reference/settings/session-settings/mutations#mutations_sync) 設定で定義されます。デフォルトでは非同期です。

**関連項目**

* [ミューテーション](/ja/reference/statements/alter/index#mutations)
* [ALTER クエリの同期性](/ja/reference/statements/alter/index#synchronicity-of-alter-queries)
* [mutations\_sync](/ja/reference/settings/session-settings/mutations#mutations_sync) 設定
* [論理更新 `UPDATE`](/ja/reference/statements/update) - パッチパートを使用する代替の論理更新
* [`APPLY PATCHES`](/ja/reference/statements/alter/apply-patches) - 論理更新のパッチを手動で適用する

## マテリアライズドカラム

更新されたカラムを参照する式を持つ [`MATERIALIZED`](/ja/reference/statements/create/table#materialized) カラムは、ミューテーション によって再計算されるため、保存された値は新しいデータとの整合性が保たれます。

### EPHEMERAL カラムから計算されたカラム

[`EPHEMERAL`](/ja/reference/statements/create/table#ephemeral) カラムは `INSERT` の実行時にのみ存在し、保存されません。そのため、これを基に計算された `MATERIALIZED` カラムは、ミューテーションによって再計算できません。このようなカラムには `INSERT` 時に計算された値が保持され、その後、その値は式と一致しなくなります。

```sql theme={null}
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;
```

```text theme={null}
┌─x─┬─m─┐
│ 2 │ 8 │
└───┴───┘
```

`m` は `8`、つまり `INSERT` 時に計算された値であり、`2 + 7` ではありません。`e` の値は、それを
指定した `INSERT` の外部では利用できません。この理由でカラムをスキップすると、mutation は server log に警告を記録します。
このようなカラムを最新の状態にするには、影響を受ける行を再度 `INSERT` してください。

## 関連コンテンツ

* ブログ記事: [ClickHouse における更新と削除の処理](https://clickhouse.com/blog/handling-updates-and-deletes-in-clickhouse)
