Kết hợp INSERT INTO ... SELECT với UNION ALL để chèn nhiều tập kết quả từ cùng một bảng nguồn vào bảng đích trong 1 truy vấn.
Ví dụ minh họa
Tạo 2 bảng:
CREATE TABLE DemoTable1 (StudentName VARCHAR(20), StudentMarks INT);
CREATE TABLE DemoTable2 (Name VARCHAR(20));
INSERT INTO DemoTable2 VALUES ('Chris');
Chèn 2 hàng vào DemoTable1 từ 1 hàng DemoTable2 với điểm khác nhau:
INSERT INTO DemoTable1 (StudentName, StudentMarks) SELECT Name, 89 FROM DemoTable2 UNION ALL SELECT Name, 98 FROM DemoTable2;
Kết quả
| StudentName | StudentMarks |
|---|---|
| Chris | 89 |
| Chris | 98 |
Giải thích
UNION ALL: Gộp 2 tập kết quả, giữ trùng lặp (khác với UNION loại trùng).- Mỗi
SELECTtrả về cùng cấu trúc cột (Name, Marks). - Chạy trong 1 transaction ngầm — tất cả thành công hoặc rollback toàn bộ.
Khi nào dùng?
- Chèn nhiều bản ghi biến thể từ 1 nguồn (ví dụ: tạo bản ghi cho nhiều năm học từ 1 học sinh).
- Chèn dữ liệu mẫu/test nhanh chóng.
- ETL: phân chia 1 luồng dữ liệu thành nhiều luồng đích.
Lưu ý
- Số cột và kiểu phải khớp giữa các SELECT và bảng đích.
UNION ALLnhanh hơnUNION(không sort để distinct).- MySQL không hỗ trợ
INSERT INTO t1, t2 SELECT ...(multi-table insert) như Oracle — cần dùng trigger hoặc ứng dụng.