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:
Sintaxe¶
INSERT [ OVERWRITE ] INTO <target_table> [ ( <target_col_name> [ , ... ] ) ]
       {
         VALUES ( { <value> | DEFAULT | NULL } [ , ... ] ) [ , ( ... ) ]  |
         <query>
       }
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 - 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 (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,- 2e- 3nas duas primeiras linhas e valores- 2,- 3e- 4na terceira linha:- VALUES ( 1, 2, 3 ) , ( 1, 2, 3 ) , ( 2, 3, 4 ) 
- 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" }')); - por: - INSERT INTO table1 (ID, varchar1, variant1) SELECT 4, 'Fourier', PARSE_JSON('{ "key1": "value1", "key2": "value2" }'); 
- 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;
+------+------------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+----------------+
| 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;
+------------+-------------------------+-------------------------+
| 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;
+------------+-------------------------+-------------------------+
| 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;
+------------+-----------+----------------+---------------+-------------+
| 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);
A primeira inserção funciona como esperado:
INSERT INTO demo_insert_type_mismatch (v) VALUES
  ('three'),
  ('four');
+-------------------------+
| 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');
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);
+-------------------------+
| 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 - worknumconté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       |
+------------+-----------+----------------+---------------+-------------+
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;
+------------------+-----------------+----------------+---------------+----------+
| 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       |
+------------+------------+----------------+---------------+-------------+
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;
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;
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"
  }');
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;
+------------+-----------+----------------+---------------+-------------+
| 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 |
|------------+-----------+----------------+---------------+-------------|
| 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';
Como o INSERT usou a cláusula OVERWRITE, as linhas antigas do sf_employees desapareceram:
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       |
+------------+-----------+----------------+---------------+-------------+