文件首頁
MySQL 9.0 參考手冊
相關文件 下載本手冊
PDF (美式信紙) - 40.0Mb
PDF (A4) - 40.1Mb
Man Pages (TGZ) - 258.2Kb
Man Pages (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 9.0 參考手冊  /  ...  /  INSERT ... SELECT 陳述式

15.2.7.1 INSERT ... SELECT 陳述式

INSERT [LOW_PRIORITY | HIGH_PRIORITY] [IGNORE]
    [INTO] tbl_name
    [PARTITION (partition_name [, partition_name] ...)]
    [(col_name [, col_name] ...)]
    {   SELECT ... 
      | TABLE table_name 
      | VALUES row_constructor_list
    }
    [ON DUPLICATE KEY UPDATE assignment_list]


value:
    {expr | DEFAULT}

value_list:
    value [, value] ...

row_constructor_list:
    ROW(value_list)[, ROW(value_list)][, ...]

assignment:
    col_name = 
          value
        | [row_alias.]col_name
        | [tbl_name.]col_name
        | [row_alias.]col_alias

assignment_list:
    assignment [, assignment] ...

透過 INSERT ... SELECT,您可以從 SELECT 陳述式的結果快速地將許多資料列插入到表格中,該陳述式可以從一個或多個表格中選取資料。例如:

INSERT INTO tbl_temp2 (fld_id)
  SELECT tbl_temp1.fld_order_id
  FROM tbl_temp1 WHERE tbl_temp1.fld_order_id > 100;

可以使用 TABLE 陳述式來取代 SELECT,如下所示:

INSERT INTO ta TABLE tb;

TABLE tb 等同於 SELECT * FROM tb。當您需要將來源表格的所有欄位插入目標表格,且不需要使用 WHERE 進行篩選時,這會很有用。此外,來自 TABLE 的資料列可以使用 ORDER BY 依據一或多個欄位排序,並且可以使用 LIMIT 子句限制插入的資料列數目。如需更多資訊,請參閱 第 15.2.16 節「TABLE 陳述式」

以下條件適用於 INSERT ... SELECT 陳述式,並且,除非另有說明,否則也適用於 INSERT ... TABLE

  • 指定 IGNORE 以忽略會導致重複鍵違規的資料列。

  • INSERT 陳述式的目標表格可以出現在查詢的 FROM 子句中,或作為 TABLE 所命名的表格。但是,您不能插入到一個表格,同時在子查詢中從同一個表格選取。

    當從同一個表格選取並插入到同一個表格時,MySQL 會建立一個內部暫存表格來保存來自 SELECT 的資料列,然後將這些資料列插入到目標表格中。但是,當 tTEMPORARY 表格時,您不能使用 INSERT INTO t ... SELECT ... FROM t,因為 TEMPORARY 表格不能在同一個陳述式中被引用兩次。同樣的理由,當 t 是一個暫存表格時,您也不能使用 INSERT INTO t ... TABLE t。請參閱 第 10.4.4 節「MySQL 中內部暫存表格的使用」第 B.3.6.2 節「TEMPORARY 表格問題」

  • AUTO_INCREMENT 欄位如常運作。

  • 為了確保二進制日誌可以用於重建原始表格,MySQL 不允許對 INSERT ... SELECTINSERT ... TABLE 陳述式進行並行插入(請參閱 第 10.11.3 節「並行插入」)。

  • 為了避免當 SELECTINSERT 引用同一個表格時出現不明確的欄位引用問題,請為 SELECT 部分中使用的每個表格提供一個唯一的別名,並使用適當的別名限定該部分中的欄位名稱。

    TABLE 陳述式不支援別名。

您可以使用表格名稱後的 PARTITION 子句,明確選取來源表格或目標表格(或兩者)的哪些分割區或子分割區(或兩者)要使用。當 PARTITION 與陳述式的 SELECT 部分中來源表格的名稱一起使用時,只會從其分割區列表中命名的分割區或子分割區中選取資料列。當 PARTITION 與陳述式的 INSERT 部分的目標表格名稱一起使用時,必須能夠將所有選取的資料列插入到選項後分割區列表中命名的分割區或子分割區中。否則,INSERT ... SELECT 陳述式會失敗。如需更多資訊和範例,請參閱 第 26.5 節「分割區選取」

TABLE 不支援 PARTITION 子句。

對於 INSERT ... SELECT 陳述式,請參閱 第 15.2.7.2 節「INSERT ... ON DUPLICATE KEY UPDATE 陳述式」,了解在 ON DUPLICATE KEY UPDATE 子句中可以引用 SELECT 欄位的條件。這也適用於 INSERT ... TABLE

沒有 ORDER BY 子句的 SELECTTABLE 陳述式傳回資料列的順序是不確定的。這表示,當使用複製時,不能保證此類 SELECT 在來源和複本上以相同的順序傳回資料列,這可能導致它們之間的不一致。為防止這種情況發生,請始終撰寫使用 ORDER BY 子句的 INSERT ... SELECTINSERT ... TABLE 陳述式,該子句在來源和複本上產生相同的資料列順序,以便進行複製。另請參閱 第 19.5.1.19 節「複製和 LIMIT」

由於這個問題,INSERT ... SELECT ON DUPLICATE KEY UPDATEINSERT IGNORE ... SELECT 陳述式會被標記為對於基於陳述式的複製是不安全的。當使用基於陳述式的模式時,此類陳述式會在錯誤日誌中產生警告,並且當使用 MIXED 模式時,會使用基於資料列的格式寫入二進制日誌。(錯誤 #11758262,錯誤 #50439)

另請參閱 第 19.2.1.1 節「基於陳述式和基於資料列的複製的優點和缺點」