適用於:
Databricks SQL
Databricks Runtime
將新的數據列插入數據表,並選擇性地截斷數據表或分割區。 您可以依值表示式或查詢的結果指定插入的數據列。
如果資料表架構中存在類型,Databricks INSERT 不支援 timestamp-millis 資料表。
Syntax
[ common_table_expression ]
INSERT { OVERWRITE | INTO } [ TABLE ] table_name
[ PARTITION clause ]
[ ( column_name [, ...] ) | BY NAME ]
query
[ common_table_expression ]
INSERT INTO [ TABLE ] table_name
[ REPLACE WHERE predicate | REPLACE USING ( column_name [, ...] ) ]
query
[ common_table_expression ]
INSERT INTO [ TABLE ] table_name [target_alias]
REPLACE ON boolean_expression
{ (query) [source_alias] | query }
Note
當您 INSERT INTO Delta 表格時,系統支援綱要的強制執行和更新。
如果數據行的數據類型無法安全地轉換成 Delta 資料表的數據類型,則會擲回運行時間例外狀況。
如果已啟用 結構描述演進 ,則新資料行可以作為結構描述的最後一個資料行(或巢狀資料行)存在,以便結構描述演進。
Parameters
-
常見的數據表運算式 (CTE) 是一或多個具名查詢,可在主要查詢區塊內重複使用多次,以避免重複計算或改善複雜巢狀查詢的可讀性。
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的數據列,再插入boolean-expression中指定的任何相符query數據列。query忽略不符合boolean_expression的數據列。boolean_expression 只能參照表格中的屬性。
REPLACE USING (column_name [, ...])
適用於:
Databricks SQL
Databricks Runtime 16.3 以上版本以原子方式刪除
table_name中在指定列與query中行匹配的數據列,然後插入來自query的數據行。 比對是以數據表和query中指定之數據行值的相等比較為基礎。針對 Databricks Runtime 16.3 到 17.1,這項功能需要指定的資料行包含資料表的所有分割區資料行。
Note
類似於
JOIN USING,REPLACE USING會使用一般相等比較來比對數據列,其中NULL值會被視為不等於任何值。 具有NULL指定數據行值的數據列不會相符,因此不會從目標數據表中移除。-
產生要插入之數據列的查詢。
您必須使查詢傳回的欄位數目與指定的或隱含的插入欄位清單匹配。
如果資料類型無法安全轉換成相符的列資料類型,則會拋出運行時例外。
適用於:
Databricks SQL
Databricks Runtime 11.3 LTS 和更新版本及以上- 如果
query包含一個 VALUES 子句,則expression可以是DEFAULT。 - 如果
query包含一個 SELECT 子句,則named_expression可以是DEFAULT。 -
DEFAULT會在DEFAULT中插入對應列的明確定義的table_name表示式,如果沒有定義,則插入NULL。
如果已啟用 結構描述演進 ,則新資料行可以作為結構描述的最後一個資料行(或巢狀資料行)存在,以便結構描述演進。
- 如果
在 boolean_expression 上進行替換
適用於:
Databricks SQL
Databricks Runtime 17.1 和更新版本如果是 Delta Lake 資料表,
table_name則REPLACE ON會以不可部分完成的方式刪除資料表query中符合指定boolean_expression資料列的任何資料列,然後插入query資料列。 與 的REPLACE WHERE不同,REPLACE ON的boolean_expression可以參考表和 .queryquery如果 是空的,則不會發生任何刪除,因為沒有query相符的數據列。
Examples
本節內容:
- INSERT 轉換為
- 使用欄位清單插入
- 使用資料分割規格和數據行清單插入
- 使用 BY NAME 子句 INSERT
- 取代 WHERE
- 取代使用
- 替換開啟
- INSERT 覆蓋
INSERT 進入
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
取代 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
取代使用
> CREATE TABLE students (name STRING, country STRING) PARTITIONED BY (country);
> CREATE TABLE new_students (name STRING, country STRING);
> INSERT INTO students VALUES
('Dylan', 'US'),
('Doug', 'UK'),
('Julia', 'IT'),
('David', 'DE'),
('Liz', 'CN'),
('Adam', NULL);
> INSERT INTO new_students VALUES
('Peter', 'FR'),
('Jennie', 'UK'),
('Eva', NULL);
-- Replace any rows in `students` that have matching `country` values in `new_students`.
> INSERT INTO TABLE students
REPLACE USING (country)
SELECT * FROM new_students;
> SELECT * FROM students;
name country
------ -------
Dylan US
Jennie UK
Julia IT
David DE
Liz CN
Peter FR
Adam NULL
Eva NULL
替換開啟
> CREATE TABLE students (name STRING, row_origin STRING)
> CREATE TABLE people (name STRING, row_origin STRING)
> INSERT INTO students VALUES ('Alice', 'table'), (NULL, 'table'), ('Bob', 'table')
> INSERT INTO people VALUES ('Alice', 'query'), (NULL, 'query'), ('Delta', 'query')
> INSERT INTO TABLE students AS t
REPLACE ON t.name <=> s.name
(SELECT * FROM people) AS s
> SELECT * FROM students
name row_origin
----- ----------
Alice query
NULL query
Bob table
Delta query
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