INSERT
適用於:Databricks SQL Databricks Runtime
將新的數據列插入數據表,並選擇性地截斷數據表或分割區。 您可以依值表示式或查詢的結果指定插入的數據列。
如果數據表架構中有類型,INSERT
則 Databricks 不支援 timestamp-millis
數據表。
Syntax
INSERT { OVERWRITE | INTO } [ TABLE ] table_name
[ PARTITION clause ]
[ ( column_name [, ...] ) | BY NAME ]
query
INSERT INTO [ TABLE ] table_name
REPLACE WHERE predicate
query
注意
當您 INSERT INTO
使用 Delta 資料表時,支援架構強制執行和演進。
如果數據行的數據類型無法安全地轉換成 Delta 資料表的數據類型,則會擲回運行時間例外狀況。
如果 啟用架構演進 ,新的數據行可以作為架構的最後一個數據行存在,以供架構演進。
參數
INTO
或OVERWRITE
如果您指定
OVERWRITE
下列項目適用:-
partition_spec
若沒有數據表,則會在插入第一個數據列之前截斷。 - 否則,在插入第一個數據列之前,會先截斷符合
partition_spec
的所有分割區。
如果您指定
INTO
插入的所有資料列都會加到現有的數據列。-
-
識別要插入的數據表。 名稱不得包含時態性規格。 如果找不到資料表,Azure Databricks 就會產生 TABLE_OR_VIEW_NOT_FOUND 錯誤。
table_name
不得為外表。適用於: Databricks Runtime 16.0 及更新的版本
table_name
可能包含選項規格。 -
選擇性參數,指定插入的目標數據分割。 您也只能部分指定分割區。
指定 靜態 數據分割時,
column = value
這個資料行不得重複於插入數據行清單中。為 指定動態 數據分割
INSERT OVERWRITE
時,必須是table_name
Delta Lake 數據表。 (column_name [, ...] )
數據表中數據行的選擇性清單。 insert 命令最多可以指定資料表中任何特定數據行一次。
適用於: Databricks SQL Databricks Runtime 12.2 LTS 和更新版本
- 如果此命令省略數據行,Databricks SQL 會改為指派對應的預設值。
- 如果目標數據表架構未定義插入數據行的任何預設值,則 Databricks SQL 會在
NULL
數據行可為 Null 時指派。 否則,Databricks SQL 會引發錯誤。
沒有提供任何數據行清單相當於指定所有數據行,除了 子句中
PARTITION
具有指派值的數據行以外,依數據表中定義的順序。BY NAME
適用於: Databricks SQL Databricks Runtime 13.3 LTS 和更新版本
使用這個子句而不是明確的數據行清單時,命令會使用 公開的數據行名稱
query
,依的順序query
產生數據行清單。 如同明確的數據行清單,每個數據行都必須存在於目標數據表中,而且不得重複。 如果中的table_name
數據行不是隱含數據行清單的一部分,則會DEFAULT
改用值。BY NAME
也會依名稱比對結構的屬性。中的任何
query
數據行都可能與 子句中指定的PARTITION
數據行或任何產生的數據行相符。取代 WHERE boolean_expression
適用於: Databricks SQL Databricks Runtime 12.2 LTS 和更新版本
如果
table_name
是 Delta Lake 數據表,請先刪除符合boolean_expression
的數據列,再插入 中指定的boolean-expression
任何數據列。query
query
忽略不符合boolean_expression
的數據列。boolean_expression
可以是評估為結果型別BOOLEAN
的任何表達式。請參閱 使用 replaceWhere 的任意選擇性覆寫。
-
產生要插入之數據列的查詢。
您必須符合查詢所傳回的數據行數目,以及指定的或隱含的插入數據行清單。
如果數據類型無法安全地轉換成相符的數據行數據類型,則會擲回運行時間例外狀況。
適用於: Databricks SQL Databricks Runtime 11.3 LTS 和更新版本
- 如果
query
由 VALUES 子句所組成,expression
可以是DEFAULT
。 - 如果
query
是由 SELECT 子句所組成,named_expression
則可以是DEFAULT
。 -
DEFAULT
會在 中DEFAULT
插入對應資料列的明確定義table_name
表示式,如果NULL
未定義則為 。
如果 啟用架構演進 ,新的數據行可以作為架構的最後一個數據行存在,以供架構演進。
- 如果
範例
本節內容:
INSERT INTO
使用 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
使用子查詢插入
-- 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;
使用 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
插入目錄
> 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 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 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
使用 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
REPLACE 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 OVERWRITE
使用 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
使用子查詢插入
-- 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
使用 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
插入覆寫目錄
> 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