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.
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 | +------------+-------------------------+-------------------------+
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¶
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 | +------------+-----------+----------------+---------------+-------------+
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');
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 | +------------+-----------+----------------+---------------+-------------+ 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:
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" }');
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 | +------------+-----------+----------------+---------------+-------------+
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';
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 | +------------+-----------+----------------+---------------+-------------+