INSERT (multitable)¶
Met à jour plusieurs tables en insérant une ou plusieurs lignes avec des valeurs de colonnes (à partir d’une requête) dans les tables. Accepte à la fois les insertions inconditionnelles et conditionnelles.
- Voir aussi :
Syntaxe¶
-- Unconditional multi-table insert
INSERT [ OVERWRITE ] ALL
  intoClause [ ... ]
<subquery>
-- Conditional multi-table insert
INSERT [ OVERWRITE ] { FIRST | ALL }
  { WHEN <condition> THEN intoClause [ ... ] }
  [ ... ]
  [ ELSE intoClause ]
<subquery>
Où :
intoClause ::= INTO <target_table> [ ( <target_col_name> [ , ... ] ) ] [ VALUES ( { <source_col_name> | DEFAULT | NULL } [ , ... ] ) ]
Paramètres requis¶
- ALL
- Insertion inconditionnelle multitable seulement - Spécifie que chaque ligne exécute chaque clause - INTOde l’instruction INSERT.- Note - Si le mot-clé - FIRSTest spécifié dans une insertion multitable inconditionnelle (ou si le mot-clé- ALLn’est pas spécifié), Snowflake retourne une erreur syntaxique.
- FIRSTou- ALL
- Insertion conditionnelle multitable seulement - FIRST
- Spécifie que chaque ligne n’exécute que la première clause - WHENpour laquelle la condition est évaluée sur TRUE. Si aucune clause- WHENn’est évaluée sur TRUE, alors la clause- ELSE, si elle est présente, s’exécute.
- ALL
- Spécifie que chaque ligne exécute toutes les clauses - WHEN. Si aucune clause- WHENn’est évaluée sur TRUE, alors la clause- ELSE, si elle est présente, s’exécute.
 - Note - Une insertion conditionnelle multitable doit contenir au moins une clause - WHEN.
- Chaque clause - WHENpeut contenir plusieurs clauses- INTOet les clauses- INTOpeuvent être insérées dans la même table cible.
- Pour toujours exécuter une clause - WHEN, utilisez :- WHEN 1=1 THEN ...
 
- condition
- Insertion conditionnelle multitable seulement - Spécifie la condition qui doit être évaluée sur TRUE pour que les valeurs spécifiées dans la clause - INTOsoient insérées. La condition peut être une liste SELECT.
- target_table
- Spécifie une table cible dans laquelle insérer les lignes. La même table peut être référencée plus d’une fois (dans des clauses - WHENdistinctes).- Plusieurs tables peuvent être ciblées en incluant une clause - INTOpour chaque table.
- subquery
- Spécifie la liste SELECT qui détermine la source des valeurs à insérer dans les tables cibles. 
Paramètres facultatifs¶
- OVERWRITE
- Spécifie de tronquer les tables cibles avant de les insérer dans les tables, tout en conservant les privilèges de contrôle d’accès sur les tables. - Les instructions INSERT avec - OVERWRITEpeuvent être traitées dans le cadre de la transaction en cours, en évitant les instructions DDL qui valident une transaction, telles que :- DROP TABLE t; CREATE TABLE t AS SELECT * FROM ... ; - Par défaut : aucune valeur (les tables cibles ne sont pas tronquées avant d’effectuer les insertions) 
- ( target_col_name [ , ... ] )
- Spécifie une ou plusieurs colonnes de la table cible dans lesquelles les valeurs de la colonne correspondante de la source sont insérées. Le nombre de colonnes cibles spécifié doit correspondre au nombre de valeurs spécifiées dans la source. - Par défaut : aucune valeur (toutes les colonnes de la table cible sont mises à jour) 
- VALUES ( source_col_name | DEFAULT | NULL [ , ... ] )
- Spécifie une ou plusieurs valeurs à insérer dans les colonnes correspondantes de la table cible. Les valeurs peuvent être : - source_col_name: spécifie la colonne dans la source qui contient la valeur à insérer dans la colonne correspondante de la table cible.
- DEFAULT: insère la valeur par défaut de la colonne correspondante dans la table cible.
- NULL: insère une valeur- NULL.
 - Chaque valeur de la clause doit être séparée par une virgule. De plus, le nombre de valeurs spécifiées doit correspondre au nombre de colonnes spécifié pour la table cible. - Par défaut : aucune valeur (les valeurs de toutes les colonnes de la source sont insérées dans les colonnes correspondantes de la table cible) 
Notes sur l’utilisation¶
- Dans une clause - INTO, la clause- VALUESest facultative. Si elle est omise, les valeurs de la liste SELECT sont insérées dans la table cible dans leur ordre naturel.
- Les expressions des clauses - WHEN(pour des insertions conditionnelles multitables) et des clauses- VALUESne peuvent faire référence qu’à la sous-requête via un alias. Le pseudonyme doit être l’un des suivants :- Alias explicite spécifié pour une expression SELECT. 
- Alias par défaut d’une expression. 
- Alias de position (1 $, 2 $, etc.). 
 - En outre, les colonnes et les expressions de la sous-requête qui ne figurent pas dans la liste SELECT extérieure ne peuvent pas être référencées dans les clauses - WHENet- VALUES. Pour plus de détails, voir Exemples (dans ce chapitre).
- Dans chaque ligne produite par la - subquery, la valeur de- source_col_namedoit être compatible avec le type de données du- target_col_namecorrespondant. Cette règle s’applique même aux lignes qui seraient filtrées par- conditiondans la clause- WHEN. L’ordre des opérations ne garantit pas que le filtre de la clause- WHENsoit appliqué avant que la valeur de- source_col_namesoit évaluée pour la compatibilité des types de données.
Exemples¶
Insertions multitables inconditionnelles¶
Insérez chaque ligne dans la table src deux fois dans les tables t1 et t2. Dans cet exemple, les lignes insérées ne sont pas identiques ; chacune des lignes insérées a des valeurs/ordres différents, car nous utilisons la clause VALUES pour varier les données :
INSERT ALL INTO t1 INTO t1 (c1, c2, c3) VALUES (n2, n1, DEFAULT) INTO t2 (c1, c2, c3) INTO t2 VALUES (n3, n2, n1) SELECT n1, n2, n3 from src; -- If t1 and t2 need to be truncated before inserting, OVERWRITE must be specified INSERT OVERWRITE ALL INTO t1 INTO t1 (c1, c2, c3) VALUES (n2, n1, DEFAULT) INTO t2 (c1, c2, c3) INTO t2 VALUES (n3, n2, n1) SELECT n1, n2, n3 from src;
Insertions multitables conditionnelles¶
Les deux exemples suivants montrent comment créer des insertions conditionnelles multitables en utilisant des clauses WHEN et une clause ELSE pour décider dans quelle(s) table(s), le cas échéant, chaque ligne est insérée.
Ces exemples montrent également la différence entre utiliser INSERT ALL et INSERT FIRST.
Exécutez toutes les clauses WHEN avec une clause ELSE :
- Les lignes où - n1 > 100satisfont également la condition- n1 > 10et sont donc insérées dans- t1deux fois lorsque le mot-clé- ALLest utilisé.
- Les lignes où - n1 <= 10satisfont le cas- ELSEet sont insérées dans- t2.- INSERT ALL WHEN n1 > 100 THEN INTO t1 WHEN n1 > 10 THEN INTO t1 INTO t2 ELSE INTO t2 SELECT n1 from src; 
Si la table src contient 3 lignes, dans lesquelles n1 a les valeurs 1, 11 et 101, alors après l’instruction INSERT, les tables t1 et t2 contiennent les valeurs indiquées ci-dessous :
t1 :
| 101 | 101 > 100, donc la première clause  | 
| 101 | 101 > 10, donc la seconde clause  | 
| 11 | 11 > 10, donc la seconde clause  | 
La ligne avec n1 = 1 n’est pas insérée dans t1 parce qu’elle ne satisfait à aucune clause WHEN qui s’insère dans t1, et parce que la clause ELSE ne s’insère pas dans t1.
t2 :
| 101 | 101 > 10, donc la seconde clause  | 
| 11 | 11 > 10, donc la seconde clause  | 
| 1 | la ligne ne satisfaisait à aucune des clauses  | 
L’exemple suivant est similaire à l’exemple précédent, sauf avec une clause FIRST .
INSERT FIRST WHEN n1 > 100 THEN INTO t1 WHEN n1 > 10 THEN INTO t1 INTO t2 ELSE INTO t2 SELECT n1 from src;
Si la table src contient 3 lignes, dans lesquelles n1 a les valeurs 1, 11 et 101, alors après l’instruction INSERT, les tables t1 et t2 contiennent les valeurs indiquées ci-dessous :
t1 :
| 101 | 101 > 100, donc la première clause  | 
| 11 | 11 > 10, donc la seconde clause  | 
La ligne avec n1 = 1 n’est pas insérée dans t1 parce qu’elle ne satisfait à aucune clause WHEN qui s’insère dans t1, et parce que la clause ELSE ne s’insère pas dans t1.
Contrairement à l’exemple précédent, qui utilisait ALL, la ligne avec n1 = 101 n’est insérée dans t1 qu’une seule fois, car la première WHEN clause est évaluée sur TRUE ; la seconde clause WHEN est ignorée.
t2 :
| 11 | 11 > 10, donc la seconde clause  | 
| 1 | la ligne ne satisfaisait à aucune des clauses  | 
La ligne n1 = 101 n’est pas insérée dans t2 parce que 101 est supérieur à 100, donc elle correspond à la première clause WHEN , mais la première clause WHEN ne s’insère pas dans t2, et l’instruction ne vérifie aucune des autres clauses WHEN ou utilise la clause ELSE , car la ligne est déjà admissible pour la première clause WHEN.
Insertions multitables avec des alias et des références¶
Insérez des valeurs en utilisant un alias positionnel ($1), un alias explicite (an_alias), et un alias par défaut ("10 + 20") ; cet exemple insère une seule ligne avec des valeurs (1, 50, 30) dans la table t1 :
INSERT ALL INTO t1 VALUES ($1, an_alias, "10 + 20") SELECT 1, 50 AS an_alias, 10 + 20;
Illustrez l’insertion de valeurs à partir de colonnes qui doivent être sélectionnées pour être référencées (b et c dans la table src) :
-- Returns error INSERT ALL WHEN c > 10 THEN INTO t1 (col1, col2) VALUES (a, b) SELECT a FROM src; -- Completes successfully INSERT ALL WHEN c > 10 THEN INTO t1 (col1, col2) VALUES (a, b) SELECT a, b, c FROM src;
Illustrez l’insertion de valeurs d’une colonne qui ne peuvent pas être référencées (src1.key) ; au lieu de cela, elle doit être sélectionnée et porter un alias :
-- Returns error INSERT ALL INTO t1 VALUES (src1.key, a) SELECT src1.a AS a FROM src1, src2 WHERE src1.key = src2.key; -- Completes successfully INSERT ALL INTO t1 VALUES (key, a) SELECT src1.key AS key, src1.a AS a FROM src1, src2 WHERE src1.key = src2.key;