INSERT (várias tabelas)¶
Atualiza várias tabelas, inserindo uma ou mais linhas com valores de coluna (de uma consulta) nas tabelas. Oferece suporte tanto a inserções incondicionais como condicionais.
- Consulte também:
Sintaxe¶
-- Unconditional multi-table insert
INSERT [ OVERWRITE ] ALL
  intoClause [ ... ]
<subquery>
-- Conditional multi-table insert
INSERT [ OVERWRITE ] { FIRST | ALL }
  { WHEN <condition> THEN intoClause [ ... ] }
  [ ... ]
  [ ELSE intoClause ]
<subquery>
Onde:
intoClause ::= INTO <target_table> [ ( <target_col_name> [ , ... ] ) ] [ VALUES ( { <source_col_name> | DEFAULT | NULL } [ , ... ] ) ]
Parâmetros obrigatórios¶
- ALL
- Somente inserção incondicional de várias tabelas - Especifica que cada linha executa cada cláusula - INTOda instrução INSERT.- Nota - Se a palavra-chave - FIRSTfor especificada em uma inserção incondicional de várias tabelas (ou se a palavra-chave- ALLnão for especificada), o Snowflake retorna um erro de sintaxe.
- FIRSTou- ALL
- Somente inserção condicional de várias tabelas - FIRST
- Especifica que cada linha executa apenas a primeira cláusula - WHENpara a qual a condição é avaliada como TRUE. Se nenhuma cláusula- WHENfor avaliada como TRUE, então a cláusula- ELSE, se presente, é executada.
- ALL
- Especifica que cada linha executa todas as cláusulas - WHEN. Se nenhuma cláusula- WHENfor avaliada como TRUE, então a cláusula- ELSE, se presente, é executada.
 - Nota - Uma inserção condicional de várias tabelas deve conter pelo menos uma cláusula - WHEN.
- Cada cláusula - WHENpode conter múltiplas cláusulas- INTOe as cláusulas- INTOpodem ser inseridas na mesma tabela de destino.
- Para executar sempre uma cláusula - WHEN, use:- WHEN 1=1 THEN ...
 
- condition
- Somente inserção condicional de várias tabelas - Especifica a condição que deve ser avaliada como TRUE para que os valores especificados na cláusula - INTOsejam inseridos. A condição pode ser uma lista SELECT.
- target_table
- Especifica uma tabela de destino na qual devem ser inseridas as linhas. A mesma tabela pode ser referenciada mais de uma vez (em cláusulas - WHENseparadas).- Tabelas múltiplas podem ser direcionadas, incluindo uma cláusula - INTOpara cada tabela.
- subquery
- Especifica a lista SELECT que determina a origem dos valores a serem inseridos nas tabelas de destino. 
Parâmetros opcionais¶
- OVERWRITE
- Especifica o truncamento das tabelas de destino antes de inserir nas tabelas, mantendo os privilégios de controle de acesso sobre as tabelas. - As instruções INSERT com - OVERWRITEpodem ser processadas dentro do escopo da transação atual, o que evita que instruções DDL confirmem uma transação, como por exemplo:- DROP TABLE t; CREATE TABLE t AS SELECT * FROM ... ; - Padrão: sem valor (as tabelas de destino não são truncadas antes de executar as inserções) 
- ( target_col_name [ , ... ] )
- Especifica uma ou mais colunas na tabela de destino na qual os valores da coluna correspondente na origem são inseridos. O número de colunas de destino especificadas deve corresponder ao número de valores especificados na origem. - Padrão: sem valor (todas as colunas da tabela de destino são atualizadas) 
- VALUES ( source_col_name | DEFAULT | NULL [ , ... ] )
- Especifica um ou mais valores a serem inseridos nas colunas correspondentes na tabela de destino. Os valores podem ser: - source_col_name: especifica a coluna na origem que contém o valor a ser inserido na coluna correspondente na tabela de destino.
- DEFAULT: insere o valor padrão para a coluna correspondente na tabela de destino.
- NULL: insere um valor- NULL.
 - Cada valor da cláusula deve ser separado por uma vírgula. Além disso, o número de valores especificados deve corresponder ao número de colunas especificadas para a tabela de destino. - Padrão: sem valor (valores de todas as colunas na fonte são inseridas nas colunas correspondentes na tabela de destino) 
Notas de uso¶
- Em uma cláusula - INTO, a cláusula- VALUESé opcional. Em caso de omissão, os valores da lista SELECT são inseridos na tabela de destino em sua ordem natural.
- Expressões em cláusulas - WHEN(para inserções condicionais de várias tabelas) e cláusulas- VALUESsó podem fazer referência à subconsulta por meio de um alias. O alias deve ser um dos seguintes:- Alias explícito especificado para uma expressão SELECT. 
- Alias padrão para uma expressão. 
- Alias posicional ($1, $2 etc.). 
 - Além disso, colunas e expressões da subconsulta que não estão na lista SELECT mais externa não podem ser referenciadas nas cláusulas - WHENe- VALUES. Para obter mais detalhes, consulte Exemplos (neste tópico).
- Em cada linha produzida pelo - subquery, o valor em- source_col_namedeve ser compatível com o tipo de dados do- target_col_namecorrespondente. Esta regra se aplica até mesmo às linhas que seriam filtradas pela cláusula- conditionna cláusula- WHEN. A ordem das operações não garante que o filtro da cláusula- WHENseja aplicado antes que o valor em- source_col_nameseja avaliado quanto à compatibilidade do tipo de dados.
Exemplos¶
Inserções incondicionais de várias tabelas¶
Insira cada linha da tabela src duas vezes nas tabelas t1 e t2. Neste exemplo, as linhas inseridas não são idênticas; cada uma das linhas inseridas tem valores/ordens diferentes porque usamos a cláusula VALUES para variar os dados:
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;
Inserções condicionais de várias tabelas¶
Os dois exemplos seguintes mostram como criar inserções condicionais de várias tabelas usando cláusulas WHEN e uma cláusula ELSE para decidir em qual(is) tabela(s), se houver, cada linha é inserida.
Estes exemplos também mostram a diferença entre usar INSERT ALL e INSERT FIRST.
Executar todas as cláusulas WHEN com uma cláusula ELSE:
- Linhas em que - n1 > 100também satisfazem a condição- n1 > 10e são, portanto, inseridas em- t1duas vezes quando a palavra-chave- ALLé usada.
- Linhas em que - n1 <= 10satisfazem o caso- ELSEe são inseridas em- t2.- INSERT ALL WHEN n1 > 100 THEN INTO t1 WHEN n1 > 10 THEN INTO t1 INTO t2 ELSE INTO t2 SELECT n1 from src; 
Se a tabela src contém 3 linhas, nas quais n1 tem os valores 1, 11, e 101, então após a instrução INSERT, as tabelas t1 e t2 manterão os valores mostrados abaixo:
t1:
| 101 | 101 > 100, logo a primeira cláusula  | 
| 101 | 101 > 10, logo a segunda cláusula  | 
| 11 | 11 > 10, logo a segunda cláusula  | 
A linha com n1 = 1 não é inserida em t1 porque não satisfaz nenhuma cláusula WHEN que insere em t1, e porque a cláusula ELSE não insere em t1.
t2:
| 101 | 101 > 10, logo a segunda cláusula  | 
| 11 | 11 > 10, log a segunda cláusula  | 
| 1 | A linha não satisfez nenhuma das cláusulas  | 
O próximo exemplo é semelhante ao exemplo anterior, mas com uma cláusula FIRST.
INSERT FIRST WHEN n1 > 100 THEN INTO t1 WHEN n1 > 10 THEN INTO t1 INTO t2 ELSE INTO t2 SELECT n1 from src;
Se a tabela src contém 3 linhas, nas quais n1 tem os valores 1, 11, e 101, então após a instrução INSERT, as tabelas t1 e t2 manterão os valores mostrados abaixo:
t1:
| 101 | 101 > 100, logo a primeira cláusula  | 
| 11 | 11 > 10, logo a segunda cláusula  | 
A linha com n1 = 1 não é inserida em t1 porque não satisfaz nenhuma cláusula WHEN que insere em t1, e porque a cláusula ELSE não insere em t1.
Ao contrário do exemplo anterior, que usava ALL, a linha com n1 = 101 é inserida em t1 apenas uma vez porque a cláusula primeiro WHEN avalia como TRUE e a segunda cláusula WHEN é ignorada.
t2:
| 11 | 11 > 10, log a segunda cláusula  | 
| 1 | A linha não satisfez nenhuma das cláusulas  | 
A linha n1 = 101 não é inserida em t2 porque 101 é maior que 100, portanto, corresponde à primeira cláusula WHEN, mas a primeira cláusula WHEN não insere em t2, e a instrução não verifica nenhuma das outras cláusulas WHEN ou usa a cláusula ELSE porque a linha já está qualificada para a primeira cláusula WHEN.
Inserções multitabelas com aliases e referências¶
Inserir valores usando um alias posicional ($1), um alias explícito (an_alias) e um alias padrão ("10 + 20"); este exemplo insere uma única linha com valores (1, 50, 30) na tabela t1:
INSERT ALL INTO t1 VALUES ($1, an_alias, "10 + 20") SELECT 1, 50 AS an_alias, 10 + 20;
Ilustrar inserindo valores de colunas que devem ser selecionadas para serem referenciadas (b e c na tabela 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;
Ilustrar inserindo valores de uma coluna que não pode ser referenciada (src1.key); em vez disso, ela deve ser selecionada e ter um 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;