共用方式為


INSERT

適用於:勾選為「是」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) 是一或多個具名查詢,可在主要查詢區塊內重複使用多次,以避免重複計算或改善複雜巢狀查詢的可讀性。

  • INTOOVERWRITE

    如果您指定 OVERWRITE 下列項目適用:

    • 如果沒有 partition_spec,資料表會在插入第一個資料列之前被裁減。
    • 否則,在插入第一個數據列之前,會先截斷符合 partition_spec 的所有分割區。

    如果您指定 INTO 插入的所有資料列都會加到現有的數據列。

  • table_name

    識別要插入的數據表。 名稱不得包含時態性規格。 如果找不到數據表,Azure Databricks 就會引發 TABLE_OR_VIEW_NOT_FOUND 錯誤。

    table_name 不得為外部表。

    適用於:核取標記為是 Databricks Runtime 16.0 和更新版本

    table_name 可能包括 期權規格

  • PARTITION 子句

    可選參數,用於指定插入的目標分區。 您也只能部分指定分割區。

    指定 靜態 分割區 (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 只能參照表格中的屬性。

    請參閱 任意選擇性覆寫,與 replaceWhere

  • REPLACE USING (column_name [, ...])

    適用於:已勾選 是 Databricks SQL 已勾選 是 Databricks Runtime 16.3 以上版本

    以原子方式刪除 table_name 中在指定列與 query 中行匹配的數據列,然後插入來自 query 的數據行。 比對是以數據表和 query中指定之數據行值的相等比較為基礎。

    針對 Databricks Runtime 16.3 到 17.1,這項功能需要指定的資料行包含資料表的所有分割區資料行。

    Note

    類似於 JOIN USINGREPLACE USING 會使用一般相等比較來比對數據列,其中 NULL 值會被視為不等於任何值。 具有 NULL 指定數據行值的數據列不會相符,因此不會從目標數據表中移除。

  • query

    產生要插入之數據列的查詢。

    您必須使查詢傳回的欄位數目與指定的或隱含的插入欄位清單匹配。

    如果資料類型無法安全轉換成相符的列資料類型,則會拋出運行時例外。

    適用於:選中為「是」 Databricks SQL 選中為「是」 Databricks Runtime 11.3 LTS 和更新版本及以上

    • 如果 query 包含一個 VALUES 子句,則 expression 可以是 DEFAULT
    • 如果 query 包含一個 SELECT 子句,則 named_expression 可以是 DEFAULT
    • DEFAULT 會在 DEFAULT中插入對應列的明確定義的 table_name 表示式,如果沒有定義,則插入 NULL

    如果已啟用 結構描述演進 ,則新資料行可以作為結構描述的最後一個資料行(或巢狀資料行)存在,以便結構描述演進。

  • target_alias

    表格的選用REPLACE ON。 別名不得包含欄位清單。

  • source_alias

    for query選用REPLACE ON。 別名不得包含欄位清單。

  • boolean_expression 上進行替換

    適用於:核取標示為是 Databricks SQL 核取標示為是 Databricks Runtime 17.1 和更新版本

    如果是 Delta Lake 資料表,table_nameREPLACE ON會以不可部分完成的方式刪除資料表query中符合指定boolean_expression資料列的任何資料列,然後插入query資料列。 與 的 REPLACE WHERE不同REPLACE ONboolean_expression可以參考表和 .query query如果 是空的,則不會發生任何刪除,因為沒有query相符的數據列。

Examples

本節內容:

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