Khi hai bảng có **cấu trúc cột khác nhau** (tên, số lượng, thứ tự, kiểu), dùng INSERT INTO ... SELECT với **liệt kê rõ cột đích và cột nguồn** để ánh xạ chính xác.
Cú pháp
INSERT INTO bang_dich (cot_dich_1, cot_dich_2, ...) SELECT cot_nguon_1, cot_nguon_2, ... FROM bang_nguon WHERE dieu_kien; -- tuỳ chọn
- Số cột, thứ tự, kiểu dữ liệu phải **tương thích** giữa SELECT và INSERT.
- Cột đích không liệt kê sẽ nhận DEFAULT hoặc NULL (nếu cho phép).
Ví dụ minh họa
Bảng nguồn (Person):
mysql> CREATE TABLE DemoTable1 (
-> PersonId INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> PersonName VARCHAR(20), PersonAge INT, PersonCountryName VARCHAR(20)
-> );
mysql> INSERT INTO DemoTable1(PersonName,PersonAge,PersonCountryName) VALUES
-> ('Chris Brown',24,'US'), ('John Doe',26,'UK'), ('David Miller',23,'AUS');
Bảng đích (Employee) – có thêm cột Salary có DEFAULT:
mysql> CREATE TABLE DemoTable2 (
-> EmployeeId INT,
-> EmployeeFullName VARCHAR(30),
-> EmployeeAge INT,
-> EmployeeCountryName VARCHAR(20),
-> EmployeeSalary INT DEFAULT 20000
-> );
Chèn từ DemoTable1 → DemoTable2 (ánh xạ tên cột khác):
mysql> INSERT INTO DemoTable2(EmployeeId,EmployeeFullName,EmployeeAge,EmployeeCountryName)
-> SELECT PersonId, PersonName, PersonAge, PersonCountryName FROM DemoTable1;
Kết quả – EmployeeSalary tự nhận DEFAULT 20000:
+------------+------------------+-------------+---------------------+----------------+ | EmployeeId | EmployeeFullName | EmployeeAge | EmployeeCountryName | EmployeeSalary | +------------+------------------+-------------+---------------------+----------------+ | 1 | Chris Brown | 24 | US | 20000 | | 2 | John Doe | 26 | UK | 20000 | | 3 | David Miller | 23 | AUS | 20000 | +------------+------------------+-------------+---------------------+----------------+
Lưu ý quan trọng
- Không dùng
INSERT INTO bang_dich SELECT * FROM bang_nguonkhi cấu trúc khác – dễ sai cột, sai kiểu, lỗi. - Luôn liệt kê cột đích và cột nguồn theo đúng thứ tự.
- Kiểu dữ liệu phải tương thích (VARCHAR→VARCHAR, INT→INT, DATE→DATE...). MySQL tự chuyển đổi một số kiểu (số→chuỗi) nhưng không đảm bảo.
- Cột AUTO_INCREMENT ở bảng đích: nếu không đưa vào INSERT, sẽ tự gán; nếu đưa vào, giá trị SELECT sẽ ghi đè (cẩn thận trùng PK).
Ứng dụng
- Migration dữ liệu giữa schema khác nhau.
- ETL: trích xuất, biến đổi (trong SELECT), nạp vào bảng đích.
- Tạo bản sao lưu/archiving với cấu trúc khác.