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
的資料列,然後將這些資料列插入到目標表格中。但是,當t
是TEMPORARY
表格時,您不能使用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 ... SELECT
或INSERT ... TABLE
陳述式進行並行插入(請參閱 第 10.11.3 節「並行插入」)。為了避免當
SELECT
和INSERT
引用同一個表格時出現不明確的欄位引用問題,請為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
子句的 SELECT
或 TABLE
陳述式傳回資料列的順序是不確定的。這表示,當使用複製時,不能保證此類 SELECT
在來源和複本上以相同的順序傳回資料列,這可能導致它們之間的不一致。為防止這種情況發生,請始終撰寫使用 ORDER BY
子句的 INSERT ... SELECT
或 INSERT ... TABLE
陳述式,該子句在來源和複本上產生相同的資料列順序,以便進行複製。另請參閱 第 19.5.1.19 節「複製和 LIMIT」。
由於這個問題,INSERT ... SELECT ON DUPLICATE KEY UPDATE
和 INSERT IGNORE ... SELECT
陳述式會被標記為對於基於陳述式的複製是不安全的。當使用基於陳述式的模式時,此類陳述式會在錯誤日誌中產生警告,並且當使用 MIXED
模式時,會使用基於資料列的格式寫入二進制日誌。(錯誤 #11758262,錯誤 #50439)