(c1, c2, c3). Vous pouvez également utiliser une expression avec un sélecteur de colonnes comme * et/ou des modificateurs comme APPLY, EXCEPT, REPLACE.
Par exemple, prenons la table suivante :
b, vous pouvez le faire à l’aide du mot-clé EXCEPT. En reprenant la syntaxe ci-dessus, veillez à insérer autant de valeurs (VALUES (v11, v13)) que de colonnes spécifiées ((c1, c3)) :
a et c sont remplies avec les valeurs transmises, et b avec sa valeur par défaut. Il est également possible d’utiliser le mot-clé DEFAULT pour insérer des valeurs par défaut :
- Les valeurs calculées à partir des expressions
DEFAULTspécifiées dans la définition de la table. - Des zéros et des chaînes vides si aucune expression
DEFAULTn’est définie.
INSERT dans n’importe quel format pris en charge par ClickHouse. Le format doit être explicitement spécifié dans la requête :
INSERT ... VALUES :
Si vous souhaitez spécifier
SETTINGS pour une requête INSERT, vous devez le faire avant la clause FORMAT, car tout ce qui suit FORMAT format_name est traité comme des données. Par exemple :Contraintes
Validation des types de données
enable_time_time64_type, allow_suspicious_low_cardinality_types, allow_suspicious_fixed_string_types, etc.) uniquement lors de la création d’une table (CREATE TABLE) et de la modification du schéma (ALTER TABLE), et non lors des opérations INSERT.
Cela signifie que si une table contenant un type de données non autorisé existe déjà, des données peuvent y être insérées même lorsque le paramètre correspondant est désactivé sur le serveur. C’est intentionnel : une fois qu’une table est créée, les insertions ne doivent pas être bloquées par des paramètres qui contrôlent la création des types.
Par exemple :
Par conséquent, un client exécutant une version plus récente (où un paramètre est activé par défaut) peut insérer dans un serveur plus ancien (où ce paramètre est désactivé) des données utilisant des types de données non autorisés, à condition que la table cible comporte déjà les types de colonnes correspondants. La validation s’effectue au niveau DDL, et non au niveau DML.
Insertion des résultats de SELECT
SELECT. Cependant, leurs noms dans l’expression SELECT et dans la table de INSERT peuvent différer. Si nécessaire, une conversion de type est effectuée.
Aucun format de données, à l’exception du format Values, ne permet d’affecter à des valeurs des expressions telles que now(), 1 + 2, etc. Le format Values permet une utilisation limitée des expressions, mais cela n’est pas recommandé, car leur exécution repose alors sur un code inefficace.
Les autres requêtes de modification des parties de données ne sont pas prises en charge : UPDATE, DELETE, REPLACE, MERGE, UPSERT, INSERT UPDATE.
Cependant, vous pouvez supprimer les anciennes données à l’aide de ALTER TABLE ... DROP PARTITION.
La clause FORMAT doit être spécifiée à la fin de la requête si la clause SELECT contient la fonction de table input().
Pour insérer une valeur par défaut au lieu de NULL dans une colonne avec un type de données non Nullable, activez le paramètre insert_null_as_default.
INSERT prend également en charge les CTE (common table expression). Par exemple, les deux instructions suivantes sont équivalentes :
Insertion de données depuis un fichier
file_name et type sont des littéraux de chaîne. Le format du fichier d’entrée doit être défini dans la clause FORMAT.
Les fichiers compressés sont pris en charge. Le type de compression est détecté à partir de l’extension du nom de fichier. Il peut aussi être spécifié explicitement dans une clause COMPRESSION. Les types pris en charge sont : 'none', 'gzip', 'deflate', 'br', 'xz', 'zstd', 'lz4', 'bz2'.
Cette fonctionnalité est disponible dans le client en ligne de commande et clickhouse-local.
Exemples
Fichier unique avec FROM INFILE
Query
Response
Plusieurs fichiers avec FROM INFILE à l’aide de globs
FROM INFILE 'input_*.csv.
Insertion à l’aide d’une fonction de table
Query
Response
Insertion dans ClickHouse Cloud
INSERT effectué avec succès, les données sont écrites dans le stockage sous-jacent. Cependant, les répliques peuvent mettre un certain temps à recevoir ces mises à jour. Par conséquent, si vous utilisez une autre connexion qui exécute une requête SELECT sur l’une de ces autres répliques, les données mises à jour peuvent ne pas encore y être visibles.
Il est possible d’utiliser select_sequential_consistency pour forcer la réplique à recevoir les dernières mises à jour. Voici un exemple de requête SELECT utilisant ce paramètre :
select_sequential_consistency augmentera la charge sur ClickHouse Keeper (utilisé en interne par ClickHouse Cloud) et peut entraîner un ralentissement des performances en fonction de la charge du service. Nous vous recommandons de ne pas activer ce paramètre, sauf si nécessaire. L’approche recommandée consiste à effectuer les lectures/écritures dans la même session ou à utiliser un pilote client qui utilise le protocole natif (et prend donc en charge les connexions persistantes).
Insertion dans une configuration répliquée
INSERT. Cela diffère de ClickHouse Cloud, où les données sont immédiatement écrites sur le stockage partagé et où les répliques s’abonnent aux modifications des métadonnées.
Notez que, dans les configurations répliquées, les INSERTs peuvent parfois prendre un certain temps (de l’ordre d’une seconde), car ils nécessitent un commit dans ClickHouse Keeper pour le consensus distribué. L’utilisation de S3 pour le stockage ajoute également de la latence.
Considérations relatives aux performances
INSERT trie les données d’entrée selon la clé primaire et les répartit en partitions selon la clé de partition. Si vous insérez des données dans plusieurs partitions à la fois, cela peut réduire considérablement les performances de la requête INSERT. Pour éviter cela :
- Ajoutez les données par lots suffisamment volumineux, par exemple 100 000 lignes à la fois.
- Regroupez les données par clé de partition avant de les envoyer à ClickHouse.
- Les données sont ajoutées en temps réel.
- Vous envoyez des données généralement triées par horodatage.
Insertions asynchrones
async_insert.
L’utilisation de async_insert ou du moteur de table Buffer ajoute une mise en mémoire tampon supplémentaire.
Insertions volumineuses ou de longue durée
max_insert_block_size lignes.
Voir aussi