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
INTO
da instrução INSERT.Nota
Se a palavra-chave
FIRST
for especificada em uma inserção incondicional de várias tabelas (ou se a palavra-chaveALL
não for especificada), o Snowflake retorna um erro de sintaxe.FIRST
ouALL
Somente inserção condicional de várias tabelas
FIRST
Especifica que cada linha executa apenas a primeira cláusula
WHEN
para a qual a condição é avaliada como TRUE. Se nenhuma cláusulaWHEN
for avaliada como TRUE, então a cláusulaELSE
, se presente, é executada.ALL
Especifica que cada linha executa todas as cláusulas
WHEN
. Se nenhuma cláusulaWHEN
for 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
WHEN
pode conter múltiplas cláusulasINTO
e as cláusulasINTO
podem 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
INTO
sejam 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
WHEN
separadas).Tabelas múltiplas podem ser direcionadas, incluindo uma cláusula
INTO
para 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
OVERWRITE
podem 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áusulasVALUES
só 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
WHEN
eVALUES
. Para obter mais detalhes, consulte Exemplos (neste tópico).Em cada linha produzida pelo
subquery
, o valor emsource_col_name
deve ser compatível com o tipo de dados dotarget_col_name
correspondente. Esta regra se aplica até mesmo às linhas que seriam filtradas pela cláusulacondition
na cláusulaWHEN
. A ordem das operações não garante que o filtro da cláusulaWHEN
seja aplicado antes que o valor emsource_col_name
seja 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 > 100
também satisfazem a condiçãon1 > 10
e são, portanto, inseridas emt1
duas vezes quando a palavra-chaveALL
é usada.Linhas em que
n1 <= 10
satisfazem o casoELSE
e 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;