Cú pháp
INSERT INTO bang_dich (cot1, cot2, ...)
SELECT cot1, cot2, ... FROM bang_nguon
[WHERE dieu_kien];
Ví dụ
Tạo bảng nguồn:
CREATE TABLE DemoTabe1 (Marks INT);
INSERT INTO DemoTabe1 VALUES (68), (89), (99), (39), (49);
Tạo bảng đích:
CREATE TABLE DemoTabe2 (Score INT);
Copy dữ liệu:
INSERT INTO DemoTabe2(Score)
SELECT Marks FROM DemoTabe1;
Kết quả: 5 dòng được copy sang DemoTabe2.
Các biến thể hữu ích
- Copy có điều kiện:
WHERE Marks >= 50. - Copy với biến đổi:
SELECT Marks * 1.1 FROM DemoTabe1. - Copy nhiều cột:
SELECT id, name, email FROM users_old. - INSERT IGNORE: Bỏ qua lỗi duplicate key.
- ON DUPLICATE KEY UPDATE: Upsert (update nếu key trùng).
Lưu ý
- Số cột và kiểu dữ liệu SELECT phải khớp với INSERT column list.
- Auto-increment cột trong bảng đích: truyền NULL hoặc không liệt kê cột đó.
- Transaction: MySQL tự wrap trong transaction ngầm (atomic).
- Không thể INSERT INTO ... SELECT từ cùng một bảng trong một số trường hợp (cần temp table hoặc subquery).
Ví dụ nâng cao: Upsert
INSERT INTO DemoTabe2(Score)
SELECT Marks FROM DemoTabe1
ON DUPLICATE KEY UPDATE Score = VALUES(Score);
(Yêu cầu Score có UNIQUE KEY hoặc PRIMARY KEY).