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

# ClickHouseデータの更新と削除

> ClickHouseで更新および削除操作を実行する方法を説明します

ClickHouse は大量の分析ワークロード向けに設計されていますが、状況によっては既存データの変更や削除を行うこともできます。これらの操作は「ミューテーション」と呼ばれ、`ALTER TABLE` コマンドを使用して実行します。

<Tip>
  頻繁に更新を行う必要がある場合は、ClickHouse の[重複排除](/ja/concepts/features/operations/insert/deduplication)の利用を検討してください。これにより、ミューテーションイベントを発生させることなく、行の更新や削除を行えます。あるいは、[論理更新](/ja/reference/statements/update)
  または[論理削除](/ja/concepts/features/operations/delete/lightweight-delete)
  を使用してください。
</Tip>

<div id="updating-data">
  ## データの更新
</div>

テーブルの行を更新するには、`ALTER TABLE...UPDATE` コマンドを使用します。

```sql theme={null}
ALTER TABLE [<database>.]<table> UPDATE <column> = <expression> WHERE <filter_expr>
```

`<expression>` は、`<filter_expr>` を満たすカラムの新しい値です。`<expression>` は、そのカラムと同じデータ型であるか、`CAST` 演算子を使って同じデータ型に変換できる必要があります。`<filter_expr>` は、データの各行に対して `UInt8` (ゼロまたは非ゼロ) の値を返す必要があります。複数の `UPDATE <column>` ステートメントは、カンマ区切りで 1 つの `ALTER TABLE` コマンドにまとめられます。

**例**:

1. 次のようなミューテーション を使うと、Dictionary ルックアップで `visitor_ids` を新しいものに置き換えて更新できます。

   ```sql theme={null}
   ALTER TABLE website.clicks
   UPDATE visitor_id = getDict('visitors', 'new_visitor_id', visitor_id)
   WHERE visit_date < '2022-01-01'
   ```

2. 1 つのコマンドで複数の値を変更したほうが、複数のコマンドに分けるより効率的な場合があります。

   ```sql theme={null}
   ALTER TABLE website.clicks
   UPDATE url = substring(url, position(url, '://') + 3), visitor_id = new_visit_id
   WHERE visit_date < '2022-01-01'
   ```

3. 分片テーブルでは、ミューテーション を `ON CLUSTER` で実行できます。

   ```sql theme={null}
   ALTER TABLE clicks ON CLUSTER main_cluster
   UPDATE click_count = click_count / 2
   WHERE visitor_id ILIKE '%robot%'
   ```

<Note>
  プライマリキーまたはソートキーの一部であるカラムは更新できません。
</Note>

<div id="deleting-data">
  ## データの削除
</div>

データを削除するには、`ALTER TABLE` コマンドを使用します。

```sql theme={null}
ALTER TABLE [<database>.]<table> DELETE WHERE <filter_expr>
```

`<filter_expr>` は、データの各行に対して UInt8 値を返す必要があります。

**例**

1. カラムの値が配列内のいずれかの値に含まれるレコードを削除します。
   ```sql theme={null}
   ALTER TABLE website.clicks DELETE WHERE visitor_id in (253, 1002, 4277)
   ```

2. このクエリは何を変更するでしょうか？
   ```sql theme={null}
   ALTER TABLE clicks ON CLUSTER main_cluster DELETE WHERE visit_date < '2022-01-02 15:00:00' AND page_id = '573'
   ```

<Note>
  テーブル内のすべてのデータを削除する場合は、`TRUNCATE TABLE [<database].]<table>` コマンドを使用するほうが効率的です。このコマンドは `ON CLUSTER` でも実行できます。
</Note>

詳細は、[`DELETE` ステートメント](/ja/snippets/delete) のドキュメントページを参照してください。

<div id="lightweight-deletes">
  ## 論理削除
</div>

行を削除するもう 1 つの方法として、**論理削除**と呼ばれる `DELETE FROM` コマンドがあります。削除された行は直ちに削除済みとしてマークされ、以降のすべてのクエリ結果から自動的に除外されるため、パーツのマージを待ったり、`FINAL` キーワードを使用したりする必要はありません。データのクリーンアップはバックグラウンドで非同期に実行されます。

```sql theme={null}
DELETE FROM [db.]table [ON CLUSTER cluster] [WHERE expr]
```

たとえば、次のクエリは、`Title` カラムにテキスト `hello` を含む `hits` テーブル内のすべての行を削除します。

```sql theme={null}
DELETE FROM hits WHERE Title LIKE '%hello%';
```

論理削除に関する補足:

* この機能は、`MergeTree` テーブルエンジンファミリーでのみ利用できます。
* 論理削除はデフォルトで同期的に実行され、すべてのレプリカが削除を処理するまで待機します。この動作は、[`lightweight_deletes_sync` 設定](/ja/reference/settings/session-settings#lightweight_deletes_sync) で制御されます。
