INSERT
Platí pro: Databricks SQL Databricks Runtime
Vloží nové řádky do table a volitelně zkrátí table nebo oddíly. Vložené řádky zadáte podle výrazů hodnot nebo výsledku dotazu.
Databricks nepodporuje INSERT
pro Hive Avrotables, pokud je přítomen typ timestamp-millis
v tableschema.
Syntaxe
INSERT { OVERWRITE | INTO } [ TABLE ] table_name
[ PARTITION clause ]
[ ( column_name [, ...] ) | BY NAME ]
query
INSERT INTO [ TABLE ] table_name
REPLACE WHERE predicate
query
Poznámka:
Když INSERT INTO
děláte rozdílový table, podporují se schema vynucení a vývoj.
Pokud datový typ columnnemůže být bezpečně přetypován na datový typ delta table, vyvolá se výjimka modulu runtime.
Pokud je schema vývoj povolený, mohou nové columns existovat jako poslední columns vašeho schema (nebo vnořeného columns) pro vývoj schema.
Parameters
INTO
neboOVERWRITE
Pokud zadáte
OVERWRITE
následující:- Bez
partition_spec
se table zkrátí před vložením prvního řádku. - Jinak se všechny oddíly odpovídající
partition_spec
sadě zkracují před vložením prvního řádku.
Pokud zadáte
INTO
všechny vložené řádky, přidají se do existujících řádků.- Bez
-
Identifikuje, kam má být table vloženo. Název nesmí obsahovat dočasnou specifikaci. Pokud nelze table najít, Azure Databricks vyvolá chybu TABLE_OR_VIEW_NOT_FOUND.
table_name
nesmí být cizím table.platí pro: Databricks Runtime 16.0 a novější
table_name
může obsahovat specifikaci možností. -
Volitelný parametr, který určuje cílovou partition pro insert. Můžete také partitionzadat pouze částečně.
Při zadávání statickéhopartition (
column = value
) se tento column nesmí opakovat v insertcolumnlist.Při zadávání dynamického partition pro
INSERT OVERWRITE
musí býttable_name
typem Delta Lake table. ( column_name [, ...] )
Volitelný list z columns v table. Příkaz insert může zadat konkrétní column z table nejvýše jednou.
Platí pro: Databricks SQL Databricks Runtime 12.2 LTS a vyšší
- Pokud tento příkaz vynechá column, databricks SQL místo toho přiřadí odpovídající výchozí hodnotu.
- Pokud cílová tableschema nedefinuje žádnou výchozí hodnotu pro vloženou column, přiřadí Databricks SQL hodnotu
NULL
, pokud je column nulovatelný. V opačném případě sql Služby Databricks vyvolá chybu.
Poskytnutí žádné columnlist je ekvivalentní k určení všech columns, kromě těch, které mají přiřazené values ve klauzuli
PARTITION
, v pořadí definovaném v table.BY NAME
Platí pro: Databricks SQL Databricks Runtime 13.3 LTS a vyšší
Pokud se tato klauzule používá místo explicitního columnlist, příkaz využije odhalené column názvy
query
k vytvoření columnlist v pořadíquery
. Stejně jako u explicitního columnlistmusí každá column existovat v cílovém tablea nesmí být duplicitní. Pokud column vtable_name
není součástí předpokládaného columnlist místo toho se použije hodnotaDEFAULT
.BY NAME
také odpovídá atributům struktur podle názvu.Žádné column v
query
možná neodpovídá column uvedenému v klauzuliPARTITION
nebo jakémukoli vygenerovanému column.NAHRADIT WHEREboolean_expression
Platí pro: Databricks SQL Databricks Runtime 12.2 LTS a vyšší
Pokud je
table_name
Delta Lake table, odstraňte řádky odpovídajícíboolean_expression
před vložením jakýchkoli řádků odpovídajícíchboolean-expression
, které jsou specifikovány vquery
. Řádky, vequery
kterých se neshodujíboolean_expression
, se ignorují.boolean_expression
může být libovolný výraz, který se vyhodnotí jako typBOOLEAN
výsledku .-
Dotaz, který vytvoří řádky, které se mají vložit.
Počet columns vrácených dotazem musí odpovídat počtu zadanému nebo předpokládanému jako insertcolumnlist.
Pokud datový typ nelze bezpečně přetypovat na odpovídající datový typ column, vyvolá se výjimka modulu runtime.
Platí pro: Databricks SQL Databricks Runtime 11.3 LTS a vyšší
- Pokud se
query
skládá z klauzule VALUES, může býtexpression
DEFAULT
. - Pokud se
query
skládá z klauzule SELECT, může býtnamed_expression
DEFAULT
. -
DEFAULT
insert výrazDEFAULT
, který je explicitně definován, odpovídající column vtable_name
, neboNULL
, pokud není žádný definován.
Pokud je schema vývoj povolený, mohou nové columns existovat jako poslední columns vašeho schema (nebo vnořeného columns) pro vývoj schema.
- Pokud se
Příklady
V této části:
- INSERT INTO
- Insert s columnlist
- Insert se specifikací partition a columnlist
- INSERT použití klauzule BY NAME
- NAHRADIT WHERE
- INSERT přepsat
INSERT INTO
INSERT pomocí 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 pomocí poddotazu
-- 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 pomocí klauzule 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 do adresáře
> 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 a 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 se specifikací partition i 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 pomocí klauzule 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
NAHRADIT 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 PŘEPSÁNÍ
Insert pomocí klauzule 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 pomocí poddotazu
-- 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 pomocí klauzule 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 přepsat adresář
> 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