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 valorNULL
.
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 ... ;
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
e3
nas duas primeiras linhas e valores2
,3
e4
na 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
worknum
contém o código de área650
.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 |
+------------+-----------+----------------+---------------+-------------+