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¶
ALLSomente 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-chaveALLnão for especificada), o Snowflake retorna um erro de sintaxe.FIRSTouALLSomente inserção condicional de várias tabelas
FIRSTEspecifica que cada linha executa apenas a primeira cláusula
WHENpara a qual a condição é avaliada como TRUE. Se nenhuma cláusulaWHENfor avaliada como TRUE, então a cláusulaELSE, se presente, é executada.ALLEspecifica que cada linha executa todas as cláusulas
WHEN. Se nenhuma cláusulaWHENfor avaliada como TRUE, então a cláusulaELSE, 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áusulasINTOe as cláusulasINTOpodem ser inseridas na mesma tabela de destino.Para executar sempre uma cláusula
WHEN, use:WHEN 1=1 THEN ...
conditionSomente 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_tableEspecifica 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.subqueryEspecifica a lista SELECT que determina a origem dos valores a serem inseridos nas tabelas de destino.
Parâmetros opcionais¶
OVERWRITEEspecifica 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 valorNULL.
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áusulaVALUESé 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áusulasVALUESsó 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
WHENeVALUES. Para obter mais detalhes, consulte Exemplos (neste tópico).Em cada linha produzida pelo
subquery, o valor emsource_col_namedeve ser compatível com o tipo de dados dotarget_col_namecorrespondente. Esta regra se aplica até mesmo às linhas que seriam filtradas pela cláusulaconditionna cláusulaWHEN. A ordem das operações não garante que o filtro da cláusulaWHENseja aplicado antes que o valor emsource_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çãon1 > 10e são, portanto, inseridas emt1duas vezes quando a palavra-chaveALLé usada.Linhas em que
n1 <= 10satisfazem o casoELSEe são inseridas emt2.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;