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:

INSERT

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>
Copy

Onde:

intoClause ::=
  INTO <target_table> [ ( <target_col_name> [ , ... ] ) ] [ VALUES ( { <source_col_name> | DEFAULT | NULL } [ , ... ] ) ]
Copy

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-chave ALL não for especificada), o Snowflake retorna um erro de sintaxe.

FIRST ou ALL

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áusula WHEN for 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 WHEN for 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 WHEN pode conter múltiplas cláusulas INTO e as cláusulas INTO 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 ... ;
Copy

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 VALUES 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 e VALUES. Para obter mais detalhes, consulte Exemplos (neste tópico).

  • Em cada linha produzida pelo subquery, o valor em source_col_name deve ser compatível com o tipo de dados do target_col_name correspondente. Esta regra se aplica até mesmo às linhas que seriam filtradas pela cláusula condition na cláusula WHEN. A ordem das operações não garante que o filtro da cláusula WHEN seja aplicado antes que o valor em source_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;
Copy

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ção n1 > 10 e são, portanto, inseridas em t1 duas vezes quando a palavra-chave ALL é usada.

  • Linhas em que n1 <= 10 satisfazem o caso ELSE e 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;
    
    Copy

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 WHEN é inserida em t1

101

101 > 10, logo a segunda cláusula WHEN também é inserida no t1

11

11 > 10, logo a segunda cláusula WHEN é inserida no t1

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 WHEN é inserida em t2. (A linha também se qualifica para a cláusula WHEN n1 > 100; entretanto, essa cláusula não insere em t2).

11

11 > 10, log a segunda cláusula WHEN é inserida no t2

1

A linha não satisfez nenhuma das cláusulas WHEN, então é inserida em t2 pela cláusula ELSE.

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;
Copy

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 WHEN é inserida em t1

11

11 > 10, logo a segunda cláusula WHEN é inserida no t1

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 WHEN é inserida no t2

1

A linha não satisfez nenhuma das cláusulas WHEN, então é inserida em t2 pela cláusula ELSE.

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;
Copy

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;
Copy

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;
Copy