MySQL 支援將 SELECT 查詢結果直接插入目標表,適用於資料遷移、彙總表建立、跨表複製等場景。
INSERT INTO 目標表 (欄位列表1)
SELECT 欄位列表2 FROM 來源表 WHERE 條件;
要求:
NOT NULL 且無預設值,來源查詢必須提供非空值。場景:三表結構
-- 學生表
s(sno, sname, sex, age, dept)
-- 課程表
c(cno, cname, tname)
-- 選課表
sc(sno, cno, grade)
需求:將成績 ≥ 80 分學生的學號、姓名、系名插入已存在的 stu(sno, sname, dept) 表。
DROP TABLE IF EXISTS stu;
CREATE TABLE stu (
sno INT(4) UNIQUE,
sname VARCHAR(20),
dept VARCHAR(10)
);
INSERT INTO stu (sno, sname, dept)
SELECT s.sno, s.sname, s.dept
FROM s
WHERE s.sno IN (SELECT sc.sno FROM sc WHERE sc.grade >= 80);
INSERT INTO stu (sno, sname, dept)
SELECT s.sno, s.sname, s.dept
FROM s
JOIN sc ON s.sno = sc.sno
WHERE sc.grade >= 80;
INSERT INTO stu (sno, sname, dept, create_time)
SELECT s.sno, s.sname, s.dept, NOW()
FROM s
WHERE s.sno IN (SELECT sc.sno FROM sc WHERE sc.grade >= 80);
-- 忽略重複主鍵/唯一鍵
INSERT IGNORE INTO stu (sno, sname, dept)
SELECT s.sno, s.sname, s.dept FROM s ...;
-- 重複時更新
INSERT INTO stu (sno, sname, dept)
SELECT s.sno, s.sname, s.dept FROM s ...
ON DUPLICATE KEY UPDATE sname=VALUES(sname), dept=VALUES(dept);
SET autocommit=0; 批次提交或使用 LOAD DATA INFILE。DISABLE KEYS(MyISAM)或暫時移除次要索引(InnoDB)。