Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MySQL

Chèn dữ liệu từ bảng này sang bảng khác có cấu trúc khác trong MySQL (INSERT INTO SELECT)

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_nguon khi 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.