INSERT

Atualiza uma tabela inserindo uma ou mais linhas na tabela. Os valores inseridos em cada coluna da tabela podem ser explicitamente especificados ou os resultados de uma consulta.

Consulte também:

INSERT (várias tabelas)

Sintaxe

INSERT [ OVERWRITE ] INTO <target_table> [ ( <target_col_name> [ , ... ] ) ]
       {
         VALUES ( { <value> | DEFAULT | NULL } [ , ... ] ) [ , ( ... ) ]  |
         <query>
       }
Copy

Parâmetros obrigatórios

target_table

Especifica a tabela de destino na qual inserir as linhas.

VALUES ( value | DEFAULT | NULL [ , ... ] )  [ , ( ... ) ]

Especifica um ou mais valores a serem inseridos nas colunas correspondentes na tabela de destino.

Em uma cláusula VALUES, você pode especificar o seguinte:

  • value: insere o valor explicitamente especificado. O valor pode ser um literal ou uma expressão.

  • 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.

Você pode inserir várias linhas especificando conjuntos adicionais de valores na cláusula. Para obter mais detalhes, consulte as Notas de uso e os Exemplos (neste tópico).

query

Especifique uma instrução de consulta que retorna valores a serem inseridos nas colunas correspondentes. Isso permite a inserção de linhas em uma tabela de destino a partir de uma ou mais tabelas de origem.

Parâmetros opcionais

OVERWRITE

Especifica que a tabela de destino deve ser truncada antes de inserir os valores na tabela. Observe que especificar esta opção não afeta os privilégios de controle de acesso na tabela.

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 (a tabela de destino não é truncada antes de executar as inserções).

( target_col_name [ , ... ] )

Especifica uma ou mais colunas na tabela de destino na qual os valores correspondentes são inseridos. O número de colunas de destino especificadas deve corresponder ao número de valores ou colunas especificadas (se os valores forem o resultado de uma consulta) na cláusula VALUES.

Padrão: sem valor (todas as colunas na tabela de destino são atualizadas).

Notas de uso

  • Usando um único comando INSERT, você pode inserir várias linhas em uma tabela especificando conjuntos adicionais de valores separados por vírgulas na cláusula VALUES.

    Por exemplo, a seguinte cláusula inseriria 3 linhas em uma tabela de 3 colunas, com valores 1, 2 e 3 nas duas primeiras linhas e valores 2, 3 e 4 na terceira linha:

    VALUES ( 1, 2, 3 ) ,
           ( 1, 2, 3 ) ,
           ( 2, 3, 4 )
    
    Copy
  • Para usar a opção OVERWRITE em INSERT, você deve usar uma função que tenha o privilégio DELETE sobre a tabela porque OVERWRITE apagará os registros existentes na tabela.

  • Algumas expressões não podem ser especificadas na cláusula VALUES. Como alternativa, especifique a expressão em uma cláusula de consulta. Por exemplo, você pode substituir:

    INSERT INTO table1 (ID, varchar1, variant1)
        VALUES (4, 'Fourier', PARSE_JSON('{ "key1": "value1", "key2": "value2" }'));
    
    Copy

    por:

    INSERT INTO table1 (ID, varchar1, variant1)
        SELECT 4, 'Fourier', PARSE_JSON('{ "key1": "value1", "key2": "value2" }');
    
    Copy
  • A cláusula VALUES é limitada a 16.384 linhas. Este limite se aplica a uma única instrução INSERT INTO … VALUES e a uma única instrução INSERT INTO … SELECT … FROM VALUES. Considere usar o comando COPY INTO <tabela> para realizar um carregamento de dados em massa. Para obter mais informações sobre como usar a cláusula VALUES em uma instrução SELECT, consulte VALUES.

Exemplos

Inserção de uma única linha usando uma consulta

Converter três valores de cadeia de caracteres em datas ou carimbos de data/hora e inseri-los em uma única linha na tabela mytable:

DESC TABLE mytable;

+------+------------------+--------+-------+---------+-------------+------------+-------+------------+---------+
| name | type             | kind   | null? | default | primary key | unique key | check | expression | comment |
|------+------------------+--------+-------+---------+-------------+------------+-------+------------+---------|
| COL1 | DATE             | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    |
| COL2 | TIMESTAMP_NTZ(9) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    |
| COL3 | TIMESTAMP_NTZ(9) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    |
+------+------------------+--------+-------+---------+-------------+------------+-------+------------+---------+

INSERT INTO mytable
  SELECT TO_DATE('2013-05-08T23:39:20.123'), TO_TIMESTAMP('2013-05-08T23:39:20.123'), TO_TIMESTAMP('2013-05-08T23:39:20.123');

SELECT * FROM mytable;

+------------+-------------------------+-------------------------+
| COL1       | COL2                    | COL3                    |
|------------+-------------------------+-------------------------|
| 2013-05-08 | 2013-05-08 23:39:20.123 | 2013-05-08 23:39:20.123 |
+------------+-------------------------+-------------------------+
Copy

Similar ao exemplo anterior, mas especificando para atualizar apenas a primeira e terceira colunas da tabela:

INSERT INTO mytable (col1, col3)
  SELECT TO_DATE('2013-05-08T23:39:20.123'), TO_TIMESTAMP('2013-05-08T23:39:20.123');

SELECT * FROM mytable;

+------------+-------------------------+-------------------------+
| COL1       | COL2                    | COL3                    |
|------------+-------------------------+-------------------------|
| 2013-05-08 | 2013-05-08 23:39:20.123 | 2013-05-08 23:39:20.123 |
| 2013-05-08 | NULL                    | 2013-05-08 23:39:20.123 |
+------------+-------------------------+-------------------------+
Copy

Inserção de várias linhas usando valores explicitamente especificados

Insira duas linhas de dados na tabela employees fornecendo ambos os conjuntos de valores em uma lista separada por vírgulas na cláusula VALUES:

SELECT * FROM employees;

+------------+-----------+----------------+---------------+-------------+
| FIRST_NAME | LAST_NAME | WORKPHONE      | CITY          | POSTAL_CODE |
|------------+-----------+----------------+---------------+-------------|
| May        | Franklin  | 1-650-249-5198 | San Francisco | 94115       |
| Gillian    | Patterson | 1-650-859-3954 | San Francisco | 94115       |
+------------+-----------+----------------+---------------+-------------+

INSERT INTO employees
  VALUES
  ('Lysandra','Reeves','1-212-759-3751','New York',10018),
  ('Michael','Arnett','1-650-230-8467','San Francisco',94116);

SELECT * FROM employees;

+------------+-----------+----------------+---------------+-------------+
| FIRST_NAME | LAST_NAME | WORKPHONE      | CITY          | POSTAL_CODE |
|------------+-----------+----------------+---------------+-------------|
| May        | Franklin  | 1-650-249-5198 | San Francisco | 94115       |
| Gillian    | Patterson | 1-650-859-3954 | San Francisco | 94115       |
| Lysandra   | Reeves    | 1-212-759-3751 | New York      | 10018       |
| Michael    | Arnett    | 1-650-230-8467 | San Francisco | 94116       |
+------------+-----------+----------------+---------------+-------------+
Copy

Em inserções de várias linhas, certifique-se de que os tipos de dados dos valores inseridos sejam consistentes entre as linhas porque o tipo de dados da primeira linha é usado como um guia. O seguinte falhará porque o tipo de dados do valor na segunda linha é diferente do tipo de dados do valor na primeira linha, mesmo que ambos os valores possam ser impostos a VARCHAR, que é o tipo de dados da coluna na tabela:

CREATE TABLE t1 (v VARCHAR);

-- works as expected.
INSERT INTO t1 (v) VALUES
   ('three'),
   ('four');

-- Fails with error "Numeric value 'd' is not recognized"
-- even though the data type of 'd' is the same as the
-- data type of the column v.
INSERT INTO t1 (v) VALUES
   (3),
   ('d');
Copy

Inserção de várias linhas usando a consulta

Inserir várias linhas de dados da tabela contractors na tabela employees:

  • Selecionar somente aquelas linhas onde a coluna worknum contém o código de área 650.

  • Inserir um valor NULL na coluna city.

SELECT * FROM employees;

+------------+-----------+----------------+---------------+-------------+
| FIRST_NAME | LAST_NAME | WORKPHONE      | CITY          | POSTAL_CODE |
|------------+-----------+----------------+---------------+-------------|
| May        | Franklin  | 1-650-249-5198 | San Francisco | 94115       |
| Gillian    | Patterson | 1-650-859-3954 | San Francisco | 94115       |
| Lysandra   | Reeves    | 1-212-759-3751 | New York      | 10018       |
| Michael    | Arnett    | 1-650-230-8467 | San Francisco | 94116       |
+------------+-----------+----------------+---------------+-------------+

SELECT * FROM contractors;

+------------------+-----------------+----------------+---------------+----------+
| CONTRACTOR_FIRST | CONTRACTOR_LAST | WORKNUM        | CITY          | ZIP_CODE |
|------------------+-----------------+----------------+---------------+----------|
| Bradley          | Greenbloom      | 1-650-445-0676 | San Francisco | 94110    |
| Cole             | Simpson         | 1-212-285-8904 | New York      | 10001    |
| Laurel           | Slater          | 1-650-633-4495 | San Francisco | 94115    |
+------------------+-----------------+----------------+---------------+----------+

INSERT INTO employees(first_name, last_name, workphone, city,postal_code)
  SELECT
    contractor_first,contractor_last,worknum,NULL,zip_code
  FROM contractors
  WHERE CONTAINS(worknum,'650');

SELECT * FROM employees;

+------------+------------+----------------+---------------+-------------+
| FIRST_NAME | LAST_NAME  | WORKPHONE      | CITY          | POSTAL_CODE |
|------------+------------+----------------+---------------+-------------|
| May        | Franklin   | 1-650-249-5198 | San Francisco | 94115       |
| Gillian    | Patterson  | 1-650-859-3954 | San Francisco | 94115       |
| Lysandra   | Reeves     | 1-212-759-3751 | New York      | 10018       |
| Michael    | Arnett     | 1-650-230-8467 | San Francisco | 94116       |
| Bradley    | Greenbloom | 1-650-445-0676 | NULL          | 94110       |
| Laurel     | Slater     | 1-650-633-4495 | NULL          | 94115       |
+------------+------------+----------------+---------------+-------------+
Copy

Inserir várias linhas de dados da tabela contractors na tabela employees usando uma expressão de tabela comum:

INSERT INTO employees (first_name,last_name,workphone,city,postal_code)
  WITH cte AS
    (SELECT contractor_first AS first_name,contractor_last AS last_name,worknum AS workphone,city,zip_code AS postal_code
     FROM contractors)
  SELECT first_name,last_name,workphone,city,postal_code
  FROM cte;
Copy

Inserir colunas de duas tabelas (emp_addr, emp_ph) em uma terceira tabela (emp) usando um INNER JOIN na coluna id das tabelas de origem:

INSERT INTO emp (id,first_name,last_name,city,postal_code,ph)
  SELECT a.id,a.first_name,a.last_name,a.city,a.postal_code,b.ph
  FROM emp_addr a
  INNER JOIN emp_ph b ON a.id = b.id;
Copy

Inserção de várias linhas para dados JSON

Inserir dois objetos JSON em uma coluna VARIANT em uma tabela:

INSERT INTO prospects
  SELECT PARSE_JSON(column1)
  FROM VALUES
  ('{
    "_id": "57a37f7d9e2b478c2d8a608b",
    "name": {
      "first": "Lydia",
      "last": "Williamson"
    },
    "company": "Miralinz",
    "email": "lydia.williamson@miralinz.info",
    "phone": "+1 (914) 486-2525",
    "address": "268 Havens Place, Dunbar, Rhode Island, 7725"
  }')
  , ('{
    "_id": "57a37f7d622a2b1f90698c01",
    "name": {
      "first": "Denise",
      "last": "Holloway"
    },
    "company": "DIGIGEN",
    "email": "denise.holloway@digigen.net",
    "phone": "+1 (979) 587-3021",
    "address": "441 Dover Street, Ada, New Mexico, 5922"
  }');
Copy

Inserção usando substituição

Este exemplo usa INSERT com OVERWRITE para reconstruir a tabela sf_employees a partir de employees depois que novos registros foram adicionados à tabela employees.

Aqui estão os dados iniciais de ambas as tabelas:

SELECT * FROM employees;
+------------+-----------+----------------+---------------+-------------+
| FIRST_NAME | LAST_NAME | WORKPHONE      | CITY          | POSTAL_CODE |
|------------+-----------+----------------+---------------+-------------|
| May        | Franklin  | 1-650-111-1111 | San Francisco | 94115       |
| Gillian    | Patterson | 1-650-222-2222 | San Francisco | 94115       |
| Lysandra   | Reeves    | 1-212-222-2222 | New York      | 10018       |
| Michael    | Arnett    | 1-650-333-3333 | San Francisco | 94116       |
+------------+-----------+----------------+---------------+-------------+
SELECT * FROM sf_employees;
+------------+-----------+----------------+---------------+-------------+
| FIRST_NAME | LAST_NAME | WORKPHONE      | CITY          | POSTAL_CODE |
|------------+-----------+----------------+---------------+-------------|
| Martin     | Short     | 1-650-999-9999 | San Francisco | 94115       |
+------------+-----------+----------------+---------------+-------------+
Copy

Esta instrução é inserida na tabela sf_employees usando a cláusula OVERWRITE:

INSERT OVERWRITE INTO sf_employees
  SELECT * FROM employees
  WHERE city = 'San Francisco';
Copy

Como o INSERT utilizava a opção OVERWRITE, a(s) antiga(s) linha(s) de sf_employees desapareceu(ram):

SELECT * FROM sf_employees;
+------------+-----------+----------------+---------------+-------------+
| FIRST_NAME | LAST_NAME | WORKPHONE      | CITY          | POSTAL_CODE |
|------------+-----------+----------------+---------------+-------------|
| May        | Franklin  | 1-650-111-1111 | San Francisco | 94115       |
| Gillian    | Patterson | 1-650-222-2222 | San Francisco | 94115       |
| Michael    | Arnett    | 1-650-333-3333 | San Francisco | 94116       |
+------------+-----------+----------------+---------------+-------------+
Copy