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

MySQL INSERT INTO ... SELECT: Copy dữ liệu giữa 2 bảng

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).