- ADD COLUMN — Ajoute une nouvelle colonne à la table.
- DROP COLUMN — Supprime la colonne.
- RENAME COLUMN — Renomme une colonne existante.
- CLEAR COLUMN — Réinitialise les valeurs de la colonne.
- COMMENT COLUMN — Ajoute un commentaire à la colonne.
- MODIFY COLUMN — Modifie le type de la colonne, l’expression par défaut, le TTL et les paramètres de la colonne.
- MODIFY COLUMN REMOVE — Supprime l’une des propriétés de la colonne.
- MODIFY COLUMN MODIFY SETTING - Modifie les paramètres de la colonne.
- MODIFY COLUMN RESET SETTING - Réinitialise les paramètres de la colonne.
- MODIFY COLUMN ADD ENUM VALUES - Ajoute de nouvelles valeurs au type Enum.
- MATERIALIZE COLUMN — Matérialise la colonne dans les parts où elle est absente. Ces actions sont décrites en détail ci-dessous.
ADD COLUMN
name, type, codec et default_expr spécifiés (voir la section Expressions par défaut).
Si la clause IF NOT EXISTS est incluse, la requête ne renvoie pas d’erreur si la colonne existe déjà. Si vous spécifiez AFTER name_after (le nom d’une autre colonne), la colonne est ajoutée après celle-ci dans la liste des colonnes de la table. Si vous voulez ajouter une colonne au début de la table, utilisez la clause FIRST. Sinon, la colonne est ajoutée à la fin de la table. Dans une chaîne d’actions, name_after peut être le nom d’une colonne ajoutée dans l’une des actions précédentes.
L’ajout d’une colonne modifie uniquement la structure de la table, sans effectuer d’opération sur les données. Les données n’apparaissent pas sur le disque après ALTER. Si les données d’une colonne sont absentes lors de la lecture de la table, elles sont complétées par des valeurs par défaut (en évaluant l’expression par défaut s’il y en a une, ou en utilisant des zéros ou des chaînes vides). La colonne apparaît sur le disque après la fusion des parts de données (voir MergeTree).
Cette approche permet d’exécuter la requête ALTER instantanément, sans augmenter le volume des anciennes données.
Exemple :
DROP COLUMN
name. Si la clause IF EXISTS est spécifiée, la requête ne renverra pas d’erreur si la colonne n’existe pas.
Supprime les données du système de fichiers. Comme l’opération supprime des fichiers entiers, la requête est exécutée presque instantanément.
Exemple :
RENAME COLUMN
name en new_name. Si la clause IF EXISTS est spécifiée, la requête ne renvoie pas d’erreur si la colonne n’existe pas. Comme le renommage n’affecte pas les données sous-jacentes, la requête s’exécute presque instantanément.
NOTE : Les colonnes spécifiées dans l’expression de clé de la table (via ORDER BY ou PRIMARY KEY) ne peuvent pas être renommées. Toute tentative de modifier ces colonnes entraînera SQL Error [524].
Exemple :
CLEAR COLUMN
IF EXISTS est spécifiée, la requête ne renverra pas d’erreur si la colonne n’existe pas.
Exemple :
COMMENT COLUMN
IF EXISTS est spécifiée, la requête ne renverra pas d’erreur si la colonne n’existe pas.
Chaque colonne peut avoir un commentaire. Si un commentaire existe déjà pour la colonne, un nouveau commentaire remplace le précédent.
Les commentaires sont stockés dans la colonne comment_expression renvoyée par la requête DESCRIBE TABLE.
Exemple :
MODIFY COLUMN
name :
- Type
- Expression par défaut
- Codec de compression
- TTL
- Paramètres au niveau des colonnes
- Valeurs d’énumération pour les types Enum/Enum8/Enum16
IF EXISTS est spécifiée, la requête ne renverra pas d’erreur si la colonne n’existe pas.
Lors de la modification du type, les valeurs sont converties comme si les fonctions toType leur étaient appliquées. Si seule l’expression par défaut est modifiée, la requête n’effectue aucune opération complexe et se termine presque instantanément.
Exemple :
FIRST | AFTER ; voir la description de ADD COLUMN, mais le type de colonne est obligatoire dans ce cas.
Exemple :
ALTER est atomique. Pour les tables MergeTree, elle est également sans verrouillage.
La requête ALTER de modification de colonnes est répliquée. Les instructions sont enregistrées dans ZooKeeper, puis chaque réplique les applique. Toutes les requêtes ALTER sont exécutées dans le même ordre. La requête attend que les opérations correspondantes soient terminées sur les autres répliques. Cependant, une requête de modification de colonnes dans une table répliquée peut être interrompue, et toutes les opérations seront effectuées de manière asynchrone.
Soyez prudent lorsque vous modifiez une colonne Nullable en Non-Nullable. Assurez-vous qu’elle ne contient aucune valeur NULL, sinon cela provoquera des problèmes à la lecture. Dans ce cas, la solution de contournement consiste à lancer Kill sur la mutation et à remettre la colonne en type Nullable.
MODIFY COLUMN REMOVE
DEFAULT, ALIAS, MATERIALIZED, CODEC, COMMENT, TTL, SETTINGS.
Syntaxe :
MODIFY COLUMN MODIFY SETTING
max_compress_block_size de la colonne pour le définir à 1MB :
MODIFY COLUMN RESET SETTING
max_compress_block_size à sa valeur par défaut :
MODIFY COLUMN ADD ENUM VALUES
Enum, Enum8, Enum16, Nullable(Enum), Nullable(Enum8) ou Nullable(Enum16)
Syntaxe :
enum_column_name :
MATERIALIZE COLUMN
DEFAULT ou MATERIALIZED. Lors de l’ajout d’une colonne matérialisée à l’aide de ALTER TABLE table_name ADD COLUMN column_name MATERIALIZED, les lignes existantes sans valeur matérialisée ne sont pas remplies automatiquement. L’instruction MATERIALIZE COLUMN peut être utilisée pour réécrire les données de colonne existantes après l’ajout ou la mise à jour d’une expression DEFAULT ou MATERIALIZED (ce qui met uniquement à jour les métadonnées, sans modifier les données existantes). Notez que matérialiser une colonne dans la clé de tri est une opération non valide, car cela pourrait rompre l’ordre de tri.
Implémentée sous forme de mutation.
Pour les colonnes avec une expression MATERIALIZED nouvelle ou mise à jour, toutes les lignes existantes sont réécrites.
Pour les colonnes avec une expression DEFAULT nouvelle ou mise à jour, le comportement dépend de la version de ClickHouse :
- Dans ClickHouse < v24.2, toutes les lignes existantes sont réécrites.
- ClickHouse >= v24.2 distingue si la valeur d’une ligne dans une colonne avec une expression
DEFAULTa été explicitement spécifiée lors de l’insertion ou non, c.-à-d. si elle a été calculée à partir de l’expressionDEFAULT. Si la valeur a été explicitement spécifiée, ClickHouse la conserve telle quelle. Si la valeur a été calculée, ClickHouse la remplace par la nouvelle expressionMATERIALIZEDou par sa version mise à jour.
- Si vous spécifiez une PARTITION, une colonne sera matérialisée uniquement pour la partition spécifiée.
Limitations
ALTER vous permet de créer et de supprimer des éléments distincts (colonnes) dans des structures de données imbriquées, mais pas des structures de données imbriquées complètes. Pour ajouter une structure de données imbriquée, vous pouvez ajouter des colonnes portant un nom tel que name.nested_name et de type Array(T). Une structure de données imbriquée équivaut à plusieurs colonnes Array dont le nom partage le même préfixe avant le point.
Le renommage de colonnes contenant des points dans leur nom est partiellement pris en charge. Les points sont réservés à l’accès aux sous-colonnes Nested, le préfixe (nom parent) doit donc rester inchangé. Seul le suffixe (nom de la sous-colonne) peut être modifié. Par exemple, a.b peut être renommé en a.c, mais renommer a.b en b.d n’est pas autorisé, car cela modifie le préfixe parent de Nested.
La suppression de colonnes dans la clé primaire ou la clé d’échantillonnage (colonnes utilisées dans l’expression ENGINE) n’est pas prise en charge. La modification du type des colonnes incluses dans la clé primaire n’est possible que si elle n’entraîne pas de modification des données (par exemple, vous pouvez ajouter des valeurs à un Enum ou remplacer un type DateTime par UInt32).
Si la requête ALTER ne suffit pas à effectuer les modifications de table dont vous avez besoin, vous pouvez créer une nouvelle table, y copier les données à l’aide de la requête INSERT SELECT, puis permuter les tables à l’aide de la requête RENAME et supprimer l’ancienne table.
La requête ALTER bloque toutes les lectures et écritures sur la table. En d’autres termes, si un SELECT long est en cours d’exécution au moment de la requête ALTER, la requête ALTER attendra qu’il se termine. En parallèle, toutes les nouvelles requêtes sur la même table attendront pendant l’exécution de cet ALTER.
Pour les tables qui ne stockent pas elles-mêmes de données (comme Merge et Distributed), ALTER modifie uniquement la structure de la table et ne modifie pas celle des tables sous-jacentes. Par exemple, lorsque vous exécutez ALTER sur une table Distributed, vous devez également exécuter ALTER sur les tables de tous les serveurs distants.