INSERT
適用於:Databricks SQL
Databricks Runtime
將新的數據列插入數據表,並選擇性地截斷數據表或分割區。 您可以依值表示式或查詢的結果指定插入的數據列。
如果數據表架構中有 timestamp-millis
類型,則 Databricks 不支援 Hive Avro 數據表的 INSERT
。
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 會改為指派對應的預設值。
- 如果目標數據表架構未定義插入數據行的任何預設值,則如果數據行可為 Null,Databricks SQL 會指派
NULL
。 否則,Databricks SQL 會引發錯誤。
若未提供任何欄位清單,就相當於在資料表中所定義的順序中,指定除
PARTITION
子句中具有指派值的欄位之外的所有欄位。BY NAME
適用於:
Databricks SQL
Databricks Runtime 13.3 LTS 和更新版本
使用這個子句而不是明確的數據行清單時,命令會使用公開的數據行名稱
query
,以query
的順序產生數據行清單。 如同明確的數據行清單,每個數據行都必須存在於目標數據表中,而且不得重複。 如果存在於table_name
中的數據行不是隱含數據行清單中的一部分,則會改用DEFAULT
值。BY NAME
也會依名稱比對結構的屬性。query
中沒有任何欄位可以與PARTITION
子句中指定的欄位或任何產生的欄位相符。REPLACE WHERE布林表達式
適用於:
Databricks SQL
Databricks Runtime 12.2 LTS 和更新版本
如果
table_name
是 Delta Lake 數據表,請先刪除符合boolean_expression
的數據列,再插入query
中指定的任何相符boolean-expression
數據列。query
忽略不符合boolean_expression
的數據列。boolean_expression
可以是評估為結果型別BOOLEAN
的任何表達式。請參閱 使用 replaceWhere 的任意選擇性覆寫。
-
產生要插入之數據列的查詢。
您必須使查詢傳回的欄位數目與指定的或隱含的插入欄位清單匹配。
如果資料類型無法安全轉換成相符的列資料類型,則會拋出運行時例外。
適用於:
Databricks SQL
Databricks Runtime 11.3 LTS 和更新版本
- 如果
query
包含一個 VALUES 子句,則expression
可以是DEFAULT
。 - 如果
query
包含一個 SELECT 子句,則named_expression
可以是DEFAULT
。 -
DEFAULT
會在table_name
中插入對應列的明確定義的DEFAULT
表示式,如果沒有定義,則插入NULL
。
如果已啟用 架構演進,新的欄位可以作為架構的最後一個欄位或巢狀欄位存在,以實現架構演進。
- 如果
範例
本節內容:
- INSERT 轉換為
- 使用欄位清單插入
- 使用資料分割規格和數據行清單插入
- 使用 BY NAME 子句 INSERT
- REPLACE WHERE
- INSERT 覆蓋
INSERT INTO
INSERT 使用 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 子句 INSERT
> 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 覆寫
使用 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