INSERT INTO db1.tbl1 (field1, field2) SELECT field1, field2 FROM db2.tbl2;
a(field1, field2)b(f1), c(f2)b.f1 和 c.f2 組合插入 aINSERT INTO a (field1, field2)
SELECT * FROM (
SELECT b.f1, c.f2
FROM b
JOIN c ON b.id = c.b_id
) AS tb; -- 必須有別名!
-- 錯誤 INSERT INTO a SELECT * FROM (SELECT f1, f2 FROM b JOIN c); -- ERROR 1248 (42000): Every derived TABLE must have its own alias -- 正確 INSERT INTO a SELECT * FROM (SELECT f1, f2 FROM b JOIN c) AS tmp;
MySQL 強制要求衍生表(子查詢結果集)必須指定別名,否則語法錯誤。
INSERT INTO target (c1, c2, c3, c4) SELECT t1.f1, t2.f2, t3.f3, t4.f4 FROM t1 JOIN t2 ON t1.id = t2.t1_id JOIN t3 ON t2.id = t3.t2_id JOIN t4 ON t3.id = t4.t3_id;
INSERT INTO a (field1, field2) SELECT b.f1, c.f2 FROM b JOIN c ON b.id = c.b_id WHERE b.status = 1 AND c.type = 'A';
-- 複製表內數據並修改某字段 INSERT INTO tbl (col1, col2, status) SELECT col1, col2, 'archived' FROM tbl WHERE create_time < '2023-01-01';
INSERT ... SELECT,避免應用層循環/*+ MAX_EXECUTION_TIME(1000) */ 防止長鎖EXPLAIN 驗證| 維度 | INSERT VALUES | INSERT SELECT |
|---|---|---|
| 數據來源 | 應用構造 | 數據庫內部 |
| 網絡往返 | 多次 | 單次 |
| 批量性能 | 較慢 | 極快 |
| 事務一致性 | 應用控制 | 單語句原子 |
| 適用場景 | 少量、動態構造 | 大量、表間遷移、聚合 |