> ## 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.

> Documentation sur les instructions 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
```

Manipule les données correspondant à l’expression de filtrage spécifiée. Cette opération est implémentée sous forme de [mutation](/fr/reference/statements/alter/index#mutations).

<Note>
  Le préfixe `ALTER TABLE` distingue cette syntaxe de celle de la plupart des autres systèmes prenant en charge SQL. Il indique que, contrairement à des requêtes similaires dans les bases de données OLTP, il s’agit d’une opération lourde qui n’est pas conçue pour être utilisée fréquemment.
</Note>

`filter_expr` doit être de type `UInt8`. Cette requête met à jour les valeurs des colonnes spécifiées avec celles des expressions correspondantes dans les lignes pour lesquelles `filter_expr` prend une valeur non nulle. Les valeurs sont converties vers le type de la colonne à l’aide de l’opérateur `CAST`. La mise à jour de colonnes utilisées dans le calcul de la clé primaire ou de la clé de partitionnement n’est pas prise en charge.

Une requête peut contenir plusieurs commandes séparées par des virgules.

La clause `IN PARTITION` limite la mutation aux partitions indiquées. Sans cette clause, pour les tables de la famille `ReplicatedMergeTree`, lorsque le paramètre [optimize\_mutations\_with\_partition\_pruning](/fr/reference/settings/session-settings/optimize) est activé (valeur par défaut), ClickHouse détecte automatiquement les conditions sur la clé de partitionnement dans `filter_expr` et ne modifie que les partitions concernées. Pour les tables `MergeTree` non répliquées, utilisez une clause `IN PARTITION` explicite pour limiter la mutation à des partitions spécifiques.

Le mode de synchronisation du traitement de la requête est défini par le paramètre [mutations\_sync](/fr/reference/settings/session-settings/mutations#mutations_sync). Par défaut, il est asynchrone.

**Voir aussi**

* [Mutations](/fr/reference/statements/alter/index#mutations)
* [Synchronisation des requêtes ALTER](/fr/reference/statements/alter/index#synchronicity-of-alter-queries)
* Paramètre [mutations\_sync](/fr/reference/settings/session-settings/mutations#mutations_sync)
* [Lightweight `UPDATE`](/fr/reference/statements/update) - Alternative légère de mise à jour utilisant des patch parts
* [`APPLY PATCHES`](/fr/reference/statements/alter/apply-patches) - Appliquer manuellement les patches issus des lightweight updates

## Colonnes matérialisées

Une colonne [`MATERIALIZED`](/fr/reference/statements/create/table#materialized) dont l'expression lit une
colonne mise à jour est recalculée lors de la mutation, afin que sa valeur stockée reste cohérente avec les nouvelles données.

### Colonnes calculées à partir de colonnes EPHEMERAL

Une colonne [`EPHEMERAL`](/fr/reference/statements/create/table#ephemeral) n'existe que pendant la durée d'un
`INSERT` et n'est jamais stockée. Une colonne `MATERIALIZED` calculée à partir de celle-ci ne peut donc pas être recalculée par une
mutation. Elle conserve la valeur calculée lors de l'`INSERT`, qui ne correspond alors plus à son
expression :

```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` vaut `8`, la valeur calculée lors de l’`INSERT`, et non `2 + 7` : la valeur de `e` n’est pas disponible
en dehors de l’`INSERT` qui l’a fournie. La mutation consigne un avertissement dans le journal du serveur lorsqu’elle ignore une
colonne pour cette raison. Pour mettre à jour une telle colonne, réexécutez l’`INSERT` pour les lignes concernées.

## Contenu associé

* Blog : [Gérer les mises à jour et les suppressions dans ClickHouse](https://clickhouse.com/blog/handling-updates-and-deletes-in-clickhouse)
