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
語法的結果中,快速將多筆資料列插入表格中,SELECT
語法可以從一個或多個表格中選取。例如
INSERT INTO tbl_temp2 (fld_id)
SELECT tbl_temp1.fld_order_id
FROM tbl_temp1 WHERE tbl_temp1.fld_order_id > 100;
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
語法的目標表格可以出現在查詢的SELECT
部分的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, “暫存表格的問題”。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.18, “複寫和 LIMIT”。
由於這個問題,INSERT ... SELECT ON DUPLICATE KEY UPDATE
和 INSERT IGNORE ... SELECT
語法被標記為對基於語法的複寫不安全。當使用基於語法的模式時,這類語法會在錯誤日誌中產生警告,且當使用 MIXED
模式時,會使用基於列的格式寫入二進位日誌。(錯誤 #11758262,錯誤 #50439)