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.

  • Para obter informações sobre como inserir dados em tabelas híbridas, consulte Carregamento de dados.

Exemplos

Os exemplos a seguir usam o comando INSERT.

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:

CREATE OR REPLACE TABLE mytable (
  col1 DATE,
  col2 TIMESTAMP_NTZ,
  col3 TIMESTAMP_NTZ);

DESC TABLE mytable;
Copy
+------+------------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+----------------+
| name | type             | kind   | null? | default | primary key | unique key | check | expression | comment | policy name | privacy domain |
|------+------------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+----------------|
| COL1 | DATE             | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        | NULL           |
| COL2 | TIMESTAMP_NTZ(9) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        | NULL           |
| COL3 | TIMESTAMP_NTZ(9) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | 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;
Copy
+------------+-------------------------+-------------------------+
| COL1       | COL2                    | COL3                    |
|------------+-------------------------+-------------------------|
| 2013-05-08 | 2013-05-08 23:39:20.123 | 2013-05-08 23:39:20.123 |
+------------+-------------------------+-------------------------+

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

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

Crie a tabela employees e insira quatro linhas de dados nela, fornecendo conjuntos de valores em uma lista separada por vírgulas na cláusula VALUES:

CREATE TABLE employees (
  first_name VARCHAR,
  last_name VARCHAR,
  workphone VARCHAR,
  city VARCHAR,
  postal_code VARCHAR);

INSERT INTO employees
  VALUES
    ('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 employees;
Copy
+------------+-----------+----------------+---------------+-------------+
| 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       |
+------------+-----------+----------------+---------------+-------------+

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. Crie uma tabela e insira duas linhas:

CREATE OR REPLACE TABLE demo_insert_type_mismatch (v VARCHAR);
Copy

A primeira inserção funciona como esperado:

INSERT INTO demo_insert_type_mismatch (v) VALUES
  ('three'),
  ('four');
Copy
+-------------------------+
| number of rows inserted |
|-------------------------|
|                       2 |
+-------------------------+

A segunda inserção falha porque o tipo de dados do valor na segunda linha ('d') é uma cadeia de caracteres, que é diferente do tipo de dados numéricos do valor na primeira linha (3). A inserção falha, embora ambos os valores possam ser impostos para VARCHAR, que é o tipo de dados da coluna na tabela. A inserção falha mesmo que o tipo de dados do valor 'd' seja o mesmo que o tipo de dados da coluna v:

INSERT INTO demo_insert_type_mismatch (v) VALUES
  (3),
  ('d');
Copy
100038 (22018): DML operation to table DEMO_INSERT_TYPE_MISMATCH failed on column V with error: Numeric value 'd' is not recognized

Quando os tipos de dados são consistentes nas linhas, a inserção é bem-sucedida e ambos os valores numéricos são impostos ao tipo de dados VARCHAR:

INSERT INTO demo_insert_type_mismatch (v) VALUES
  (3),
  (4);
Copy
+-------------------------+
| number of rows inserted |
|-------------------------|
|                       2 |
+-------------------------+

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;
Copy
+------------+-----------+----------------+---------------+-------------+
| 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       |
+------------+-----------+----------------+---------------+-------------+
CREATE TABLE contractors (
  contractor_first VARCHAR,
  contractor_last VARCHAR,
  worknum VARCHAR,
  city VARCHAR,
  zip_code VARCHAR);

INSERT INTO contractors
  VALUES
    ('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);

SELECT * FROM contractors;
Copy
+------------------+-----------------+----------------+---------------+----------+
| 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;
Copy
+------------+------------+----------------+---------------+-------------+
| 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       |
+------------+------------+----------------+---------------+-------------+

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:

CREATE TABLE prospects (column1 VARIANT);

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, 02801"
  }')
  , ('{
    "_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, 87105"
  }');
Copy

Inserção usando OVERWRITE

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;
Copy
+------------+-----------+----------------+---------------+-------------+
| 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;
Copy
+------------+-----------+----------------+---------------+-------------+
| FIRST_NAME | LAST_NAME | WORKPHONE      | CITY          | POSTAL_CODE |
|------------+-----------+----------------+---------------+-------------|
| Mary       | Smith     | 1-650-999-9999 | San Francisco | 94115       |
+------------+-----------+----------------+---------------+-------------+

Essa instrução insere linhas 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 usou a cláusula OVERWRITE, as linhas antigas do sf_employees desapareceram:

SELECT * FROM sf_employees;
Copy
+------------+-----------+----------------+---------------+-------------+
| 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       |
+------------+-----------+----------------+---------------+-------------+