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

Sao chép dữ liệu giữa các bảng MySQL có cấu trúc cột khác nhau

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 ALL trong mệnh đề SELECT.

Lưu ý

  • Số lượng và kiểu dữ liệu cột trong SELECT phả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ền NULL.
  • Dùng INSERT IGNORE hoặc ON DUPLICATE KEY UPDATE để xử lý trùng khóa chính.