Vấn đề: INSERT INTO SELECT với tên cột khác nhau
Khi cần sao chép dữ liệu từ bảng này sang bảng khác mà tên cột hoặc số lượng cột không khớp, dùng INSERT INTO ... SELECT với danh sách cột tường minh.
Giải pháp: Chỉ định cột nguồn và cột đích
Cú pháp: INSERT INTO target_table (col1, col2, ...) SELECT src_col1, src_col2, ... FROM source_table;
1. Tạo bảng nguồn (có AUTO_INCREMENT)
CREATE TABLE SourceTable (
ClientId INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
ClientName VARCHAR(20),
ClientAge INT DEFAULT 29
) AUTO_INCREMENT = 1000;
INSERT INTO SourceTable (ClientName, ClientAge) VALUES
('Chris', 45),
('David', 29),
('Mike', 37),
('Sam', NULL); -- ClientAge sẽ lấy DEFAULT 29
2. Dữ liệu bảng nguồn
+----------+------------+-----------+
| ClientId | ClientName | ClientAge |
+----------+------------+-----------+
| 1000 | Chris | 45 |
| 1001 | David | 29 |
| 1002 | Mike | 37 |
| 1003 | Sam | 29 |
+----------+------------+-----------+
3. Tạo bảng đích (cấu trúc khác)
CREATE TABLE TargetTable (
EmployeeId INT,
EmployeeName VARCHAR(20),
EmployeeAge INT
);
4. Sao chép dữ liệu với mapping cột
INSERT INTO TargetTable (EmployeeId, EmployeeName, EmployeeAge)
SELECT ClientId, ClientName, ClientAge FROM SourceTable;
5. Kết quả bảng đích
+------------+--------------+-------------+
| EmployeeId | EmployeeName | EmployeeAge |
+------------+--------------+-------------+
| 1000 | Chris | 45 |
| 1001 | David | 29 |
| 1002 | Mike | 37 |
| 1003 | Sam | 29 |
+------------+--------------+-------------+
Các trường hợp phổ biến
- Thêm giá trị cố định:
INSERT INTO Target (Id, Name, Status) SELECT Id, Name, 'ACTIVE' FROM Source; - Biến đổi dữ liệu:
SELECT UPPER(Name), Age * 12 ... - Lọc dữ liệu:
SELECT ... FROM Source WHERE Age > 30; - Gộp nhiều bảng: Dùng
UNION ALLtrong mệnh đềSELECT.
Lưu ý
- Số lượng và kiểu dữ liệu cột trong
SELECTphải khớp với danh sách cột đích. - Nếu cột đích là
AUTO_INCREMENT, có thể bỏ qua trong danh sách cột hoặc truyềnNULL. - Dùng
INSERT IGNOREhoặcON DUPLICATE KEY UPDATEđể xử lý trùng khóa chính.