INSERT
Aplica-se a: Databricks SQL
Databricks Runtime
Insere novas linhas em um(a) table e, opcionalmente, trunca o table ou as partições. Você especifica as linhas inseridas por expressões de valor ou o resultado de uma consulta.
Databricks não suporta INSERT
para Hive Avrotables se o tipo de timestamp-millis
estiver presente no tableschema.
Sintaxe
INSERT { OVERWRITE | INTO } [ TABLE ] table_name
[ PARTITION clause ]
[ ( column_name [, ...] ) | BY NAME ]
query
INSERT INTO [ TABLE ] table_name
REPLACE WHERE predicate
query
Nota
Quando fazes INSERT INTO
um tableDelta, a imposição e a evolução schema são sustentadas.
Se o tipo de dados de um columnnão puder ser convertido com segurança para um tipo de dados do Delta table, uma exceção em tempo de execução é lançada.
Se a evolução schema estiver ativada, novas columns podem existir como a última columns do seu schema (ou columnsaninhado) para que o schema possa evoluir.
Parameters
INTO
ouOVERWRITE
Se especificar
OVERWRITE
o seguinte, aplicar-se-á o seguinte:- Sem um
partition_spec
o table é truncado antes de inserir a primeira linha. - Caso contrário, todas as partições correspondentes ao
partition_spec
são truncadas antes de inserir a primeira linha.
Se você especificar
INTO
todas as linhas inseridas serão aditivas às linhas existentes.- Sem um
-
Identifica o table a ser inserido. O nome não deve incluir uma especificação temporal. Se o table não puder ser encontrado, o Azure Databricks gerará um erro TABLE_OR_VIEW_NOT_FOUND.
table_name
não deve ser um tableestrangeiro.Aplica-se a:
Databricks Runtime 16.0 e versões posteriores
table_name
pode incluir uma especificação de opções. -
Um parâmetro opcional que define um partition de destino para o insert. Você também pode especificar apenas parcialmente o partition.
Ao especificar uma partition estática (
column = value
), esta column não deve ser repetida no insertcolumnlist.Ao especificar um partition dinâmico para
INSERT OVERWRITE
, otable_name
deve ser um tableDelta Lake. ( column_name [, ...] )
Um list opcional de columns no table. O comando insert pode especificar qualquer column específico do table no máximo uma vez.
Aplica-se a:
Databricks SQL
Databricks Runtime 12.2 LTS e superior
- Se este comando omitir um column, o Databricks SQL atribuirá o valor padrão correspondente.
- Se o tableschema de destino não definir nenhum valor padrão para o columninserido, o Databricks SQL atribuirá
NULL
se o column for anulável. Caso contrário, o Databricks SQL gerará um erro.
A ausência de columnlist equivale a especificar todos os columns, exceto aqueles com values atribuído na cláusula
PARTITION
, na ordem definida pela table.BY NAME
Aplica-se a:
Databricks SQL
Databricks Runtime 13.3 LTS e superior
Quando esta cláusula é usada em vez de um columnlistexplícito, o comando usa os nomes de column expostos de
query
para produzir o columnlist na ordem dequery
. Tal como acontece com um columnlistexplícito, cada column deve existir no tablede destino e não deve ser duplicado. Se um column presente emtable_name
não fizer parte do columnlist implícito, o valorDEFAULT
será usado.BY NAME
também corresponde a atributos de structs por nome.Nenhum column no
query
pode corresponder a um column especificado na cláusulaPARTITION
ou a qualquer column gerado.SUBSTITUIR WHEREboolean_expression
Aplica-se a:
Databricks SQL
Databricks Runtime 12.2 LTS e superior
Se
table_name
for um Delta Lake table, exclua as linhas que correspondem aboolean_expression
antes de inserir quaisquer linhas que correspondam aboolean-expression
especificadas emquery
. As linhas emquery
que não correspondemboolean_expression
são ignoradas.boolean_expression
pode ser qualquer expressão que seja avaliada como um tipoBOOLEAN
de resultado.-
Uma consulta que produz as linhas a serem inseridas.
Você deve ajustar o número de columns retornados pela consulta ao insertcolumnlistespecificado ou implícito.
Se um tipo de dados não puder ser convertido com segurança para o tipo de dados column correspondente, uma exceção de tempo de execução será lançada.
Aplica-se a:
Databricks SQL
Databricks Runtime 11.3 LTS e superior
- Se
query
consistir numa cláusula VALUES, aexpression
pode serDEFAULT
. - Se
query
consistir numa cláusula SELECT, anamed_expression
pode serDEFAULT
. -
DEFAULT
insert a expressãoDEFAULT
explicitamente definida do column correspondente emtable_name
, ouNULL
se nenhuma estiver definida.
Se a evolução de schema estiver habilitada, columns novos poderão existir como o último columns do seu schema (ou columnsaninhado) para permitir que o schema evolua.
- Se
Exemplos
Nesta secção:
- INSERT PARA
- Insert com um columnlist
- Insert com uma especificação partition e um columnlist
- INSERT usando a cláusula BY NAME
- SUBSTITUIR WHERE
- INSERT SUBSTITUIR
INSERT EM
INSERT usando VALUES
> CREATE TABLE students (name VARCHAR(64), address VARCHAR(64) DEFAULT 'unknown', student_id INT)
PARTITIONED BY (student_id);
-- Single row insert using a `VALUES` clause specifying all columns.
> INSERT INTO students VALUES
('Amy Smith', '123 Park Ave, San Jose', 111111);
-- Single row insert using an implicit default for address
> INSERT INTO students(name, student_id) VALUES('Grayson Miller', 222222);
-- Single row insert using an explicit DEFAULT keyword for address
> INSERT INTO students VALUES('Youna Kim', DEFAULT, 333333);
-- Multi-row insert using a `VALUES` clause
> INSERT INTO students VALUES
('Bob Brown', '456 Taylor St, Cupertino', 444444),
('Cathy Johnson', '789 Race Ave, Palo Alto', 555555);
-- Multi-row insert using a mix of DEFAULT and literals
> INSERT INTO students VALUES
('Gwyneth Zhao', '120 Main St, Rockport', 666666),
('Jackson Peterson', DEFAULT, 777777);
> SELECT * FROM students;
name address student_id
---------------- ------------------------ ----------
Amy Smith 123 Park Ave, San Jose 111111
Grayson Miller unknown 222222
Youna Kim unknown 333333
Bob Brown 456 Taylor St, Cupertino 444444
Cathy Johnson 789 Race Ave, Palo Alto 555555
Gwyneth Zhao 120 Main St, Rockport 666666
Jackson Peterson unknown 777777
Insert usando uma subconsulta
-- Assuming the persons table has already been created and populated.
> SELECT * FROM persons;
name address ssn
------------- ------------------------- ---------
Dora Williams 134 Forest Ave, Melo Park 123456789
Eddie Davis 245 Market St, Milpitas 345678901
> INSERT INTO students PARTITION (student_id = 444444)
SELECT name, address FROM persons WHERE name = "Dora Williams";
> SELECT * FROM students;
name address student_id
------------- ------------------------- ----------
Amy Smith 123 Park Ave, San Jose 111111
Bob Brown 456 Taylor St, Cupertino 222222
Cathy Johnson 789 Race Ave, Palo Alto 333333
Dora Williams 134 Forest Ave, Melo Park 444444
-- Use an option specification to influence the write behavior
INSERT INTO t WITH ('write.split-size' = 10) SELECT * FROM s;
Insert utilização de uma cláusula TABLE
-- Assuming the visiting_students table has already been created and populated.
> SELECT * FROM visiting_students;
name address student_id
------------- --------------------- ----------
Fleur Laurent 345 Copper St, London 777777
Gordon Martin 779 Lake Ave, Oxford 888888
> INSERT INTO students TABLE visiting_students;
> SELECT * FROM students;
name address student_id
------------- ------------------------- ----------
Amy Smith 123 Park Ave,San Jose 111111
Bob Brown 456 Taylor St, Cupertino 222222
Cathy Johnson 789 Race Ave, Palo Alto 333333
Dora Williams 134 Forest Ave, Melo Park 444444
Fleur Laurent 345 Copper St, London 777777
Gordon Martin 779 Lake Ave, Oxford 888888
Insert num diretório
> CREATE TABLE students (name VARCHAR(64), address VARCHAR(64), student_id INT)
PARTITIONED BY (student_id)
LOCATION "/path/to/students_table";
> INSERT INTO delta.`/path/to/students_table` VALUES
('Amy Smith', '123 Park Ave, San Jose', 111111);
> SELECT * FROM students;
name address student_id
------------- ------------------------- ----------
Amy Smith 123 Park Ave, San Jose 111111
Insert com um columnlist
> INSERT INTO students (address, name, student_id) VALUES
('Hangzhou, China', 'Kent Yao', 11215016);
> SELECT * FROM students WHERE name = 'Kent Yao';
name address student_id
--------- ---------------------- ----------
Kent Yao Hangzhou, China 11215016
Insert com uma especificação partition e uma columnlist
> INSERT INTO students PARTITION (student_id = 11215017) (address, name) VALUES
('Hangzhou, China', 'Kent Yao Jr.');
> SELECT * FROM students WHERE student_id = 11215017;
name address student_id
------------ ---------------------- ----------
Kent Yao Jr. Hangzhou, China 11215017
INSERT usando a cláusula BY NAME
> CREATE TABLE target(n INT, text STRING, s STRUCT<a INT, b INT>);
> INSERT INTO target BY NAME SELECT named_struct('b', 2, 'a', 1) AS s, 0 AS n, 'data' AS text;
> SELECT * FROM target;
0 data {"a":1,"b":2}
> CREATE OR REPLACE TABLE target(n INT, arr ARRAY<STRUCT<a INT, b INT>>);
> INSERT INTO target BY NAME SELECT array(named_struct('b', 2, 'a', 1)) AS arr, 0 AS n;
> INSERT INTO target BY NAME SELECT array(named_struct('b', 2, 'a', 1)) AS arr;
> SELECT * FROM target;
0 [{"a":1,"b":2}]
NULL [{"a":1,"b":2}]
> INSERT INTO target BY NAME SELECT array(named_struct('b', 2, 'a', 1)) AS arr, 0 AS badname;
Error
> INSERT INTO target BY NAME SELECT array(named_struct('b', 2, 'a', 1)) AS arr, 0 AS n, 1 AS n;
Error: INSERT_COLUMN_ARITY_MISMATCH.TOO_MANY_DATA_COLUMNS
SUBSTITUA WHERE
> CREATE TABLE sales(tx_date DATE, amount INTEGER);
> INSERT INTO sales VALUES
(DATE'2022-10-01', 1234),
(DATE'2022-10-02', 2345),
(DATE'2022-10-03', 3456),
(DATE'2022-11-01', 3214);
-- Replace any rows with a transaction date in October 2022.
> INSERT INTO sales REPLACE WHERE tx_date BETWEEN '2022-10-01' AND '2022-10-31'
VALUES (DATE'2022-10-01', 1237),
(DATE'2022-10-02', 2378),
(DATE'2022-10-04', 2456),
(DATE'2022-10-05', 6328);
> SELECT * FROM sales ORDER BY tx_date;
tx_date amount
---------- ------
2022-10-01 1237
2022-10-02 2378
2022-10-04 2456
2022-10-05 6328
2022-11-01 3214
INSERT SOBRESCREVER
Insert usando uma cláusula VALUES
-- Assuming the students table has already been created and populated.
> SELECT * FROM students;
name address student_id
------------- ------------------------- ----------
Amy Smith 123 Park Ave, San Jose 111111
Bob Brown 456 Taylor St, Cupertino 222222
Cathy Johnson 789 Race Ave, Palo Alto 333333
Dora Williams 134 Forest Ave, Melo Park 444444
Fleur Laurent 345 Copper St, London 777777
Gordon Martin 779 Lake Ave, Oxford 888888
Helen Davis 469 Mission St, San Diego 999999
Jason Wang 908 Bird St, Saratoga 121212
> INSERT OVERWRITE students VALUES
('Ashua Hill', '456 Erica Ct, Cupertino', 111111),
('Brian Reed', '723 Kern Ave, Palo Alto', 222222);
> SELECT * FROM students;
name address student_id
---------- ----------------------- ----------
Ashua Hill 456 Erica Ct, Cupertino 111111
Brian Reed 723 Kern Ave, Palo Alto 222222
Insert usando uma subconsulta
-- Assuming the persons table has already been created and populated.
> SELECT * FROM persons;
name address ssn
------------- ------------------------- ---------
Dora Williams 134 Forest Ave, Melo Park 123456789
Eddie Davis 245 Market St,Milpitas 345678901
> INSERT OVERWRITE students PARTITION (student_id = 222222)
SELECT name, address FROM persons WHERE name = "Dora Williams";
> SELECT * FROM students;
name address student_id
------------- ------------------------- ----------
Ashua Hill 456 Erica Ct, Cupertino 111111
Dora Williams 134 Forest Ave, Melo Park 222222
Insert utilização de uma cláusula TABLE
-- Assuming the visiting_students table has already been created and populated.
> SELECT * FROM visiting_students;
name address student_id
------------- --------------------- ----------
Fleur Laurent 345 Copper St, London 777777
Gordon Martin 779 Lake Ave, Oxford 888888
> INSERT OVERWRITE students TABLE visiting_students;
> SELECT * FROM students;
name address student_id
------------- --------------------- ----------
Fleur Laurent 345 Copper St, London 777777
Gordon Martin 779 Lake Ave, Oxford 888888
Insert sobrescrever um diretório
> CREATE TABLE students (name VARCHAR(64), address VARCHAR(64), student_id INT)
PARTITIONED BY (student_id)
LOCATION "/path/to/students_table";
> INSERT OVERWRITE delta.`/path/to/students_table` VALUES
('Amy Smith', '123 Park Ave, San Jose', 111111);
> SELECT * FROM students;
name address student_id
------------- ------------------------- ----------
Amy Smith 123 Park Ave, San Jose 111111