Ajouter une colonne à une table
Nous allons utiliser clickhouse-local :
clickhouse -m --output_format_pretty_row_numbers=Imaginons que nous ayons la table suivante :
CREATE TABLE events (
date Date DEFAULT today(),
name String
)
ENGINE = MergeTree
ORDER BY date;Ajoutons un enregistrement :
INSERT INTO events (name) VALUES ('Alexey');Interrogez maintenant la table events :
SELECT *
FROM events;┌───────date─┬─name───┐
│ 2024-12-18 │ Alexey │
└────────────┴────────┘Ajout d’une nouvelle colonne
Supposons maintenant que nous voulions ajouter une nouvelle colonne appelée favoriteNumber, de type Float64.
Nous pouvons le faire à l’aide de la clause ALTER TABLE...ADD COLUMN :
ALTER TABLE events
ADD COLUMN favoriteNumber Float64 DEFAULT 7;Si nous interrogeons la table events, nous verrons le résultat suivant :
┌───────date─┬─name───┬─favoriteNumber─┐
│ 2024-12-18 │ Alexey │ 7 │
└────────────┴────────┴────────────────┘La ligne Alexey vaut 7 par défaut, car cette colonne n'existait pas lorsque nous avons ajouté cette ligne.
Ensuite, ajoutons une autre colonne :
INSERT INTO events (name) VALUES ('Tyler');Si nous interrogeons la table events, nous obtenons la sortie suivante :
┏━━━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━━━━━━━┓
┃ date ┃ name ┃ favoriteNumber ┃
┡━━━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━━━━━━━┩
│ 2024-12-18 │ Tyler │ 7 │
├────────────┼────────┼────────────────┤
│ 2024-12-18 │ Alexey │ 7 │
└────────────┴────────┴────────────────┘Modification de la valeur par défaut d'une colonne
Si nous modifions la colonne favoriteNumber pour lui attribuer un type différent à l'aide de la clause ALTER TABLE...MODIFY COLUMN, les choses deviennent intéressantes :
ALTER TABLE events
MODIFY COLUMN favoriteNumber Float64 DEFAULT 99;Si nous exécutons à nouveau une requête sur events, nous verrons la sortie suivante :
┏━━━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━━━━━━━┓
┃ date ┃ name ┃ favoriteNumber ┃
┡━━━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━━━━━━━┩
│ 2024-12-18 │ Tyler │ 7 │
├────────────┼────────┼────────────────┤
│ 2024-12-18 │ Alexey │ 99 │
└────────────┴────────┴────────────────┘Tyler conserve la valeur 7, qui était la valeur par défaut lorsque cette ligne a été créée.
Alexey récupère la nouvelle valeur par défaut 99, car la colonne favoriteNumber n'existait pas lorsque cette ligne a été créée.
Si nous voulons que la ligne Alexey utilise immédiatement la valeur par défaut actuelle, nous devons appeler OPTIMIZE TABLE pour forcer l’écriture des valeurs par défaut actuelles sur le disque :
OPTIMIZE TABLE events;Une fois cela fait, supposons que nous modifiions à nouveau la valeur par défaut :
ALTER TABLE events
MODIFY COLUMN favoriteNumber Float64 DEFAULT 21;Insérez ensuite une autre ligne :
INSERT INTO events (name) VALUES ('Tanya');Enfin, interrogeons à nouveau events :
┏━━━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━━━━━━━┓
┃ date ┃ name ┃ favoriteNumber ┃
┡━━━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━━━━━━━┩
│ 2024-12-18 │ Alexey │ 99 │
├────────────┼────────┼────────────────┤
│ 2024-12-18 │ Tyler │ 7 │
├────────────┼────────┼────────────────┤
│ 2024-12-18 │ Tanya │ 21 │
└────────────┴────────┴────────────────┘Tanya récupère la nouvelle valeur par défaut de 21, mais Alexey conserve l’ancienne valeur par défaut de 99.
Contrôler la position d’une colonne dans une table
Lorsque nous ajoutons une nouvelle colonne, elle est ajoutée par défaut à la fin de la table.
Nous pouvons toutefois utiliser les clauses FIRST et AFTER pour définir l’emplacement d’une colonne.
Par exemple, si nous voulions ajouter une colonne appelée favoriteColor après la colonne name, nous pourrions procéder ainsi :
ALTER TABLE events
ADD COLUMN favoriteColor String DEFAULT 'Yellow' AFTER name;Interrogeons events :
┏━━━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━┓
┃ date ┃ name ┃ favoriteColor ┃ favoriteNumber ┃
┡━━━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━┩
│ 2024-12-18 │ Alexey │ Yellow │ 99 │
├────────────┼────────┼───────────────┼────────────────┤
│ 2024-12-18 │ Tyler │ Yellow │ 7 │
├────────────┼────────┼───────────────┼────────────────┤
│ 2024-12-18 │ Tanya │ Yellow │ 21 │
└────────────┴────────┴───────────────┴────────────────┘Et si nous voulions ajouter une colonne favoriteDatabase et la faire apparaître en tête de liste, nous pourrions procéder ainsi :
ALTER TABLE events
ADD COLUMN favoriteDatabase String DEFAULT 'ClickHouse' FIRST;┏━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━┓
┃ favoriteDatabase ┃ date ┃ name ┃ favoriteColor ┃ favoriteNumber ┃
┡━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━┩
│ ClickHouse │ 2024-12-18 │ Tanya │ Yellow │ 21 │
├──────────────────┼────────────┼────────┼───────────────┼────────────────┤
│ ClickHouse │ 2024-12-18 │ Alexey │ Yellow │ 99 │
├──────────────────┼────────────┼────────┼───────────────┼────────────────┤
│ ClickHouse │ 2024-12-18 │ Tyler │ Yellow │ 7 │
└──────────────────┴────────────┴────────┴───────────────┴────────────────┘Voyons maintenant la définition de la table :
SHOW CREATE TABLE events
FORMAT LineAsStringCREATE TABLE default.`clickhouse-local-ab404c86-56cc-495b-ad1d-fb343cac3bc0events`
(
`favoriteDatabase` String DEFAULT 'ClickHouse',
`date` Date DEFAULT today(),
`name` String,
`favoriteColor` String DEFAULT 'Yellow',
`favoriteNumber` Float64 DEFAULT 21
)
ENGINE = MergeTree
ORDER BY date