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

Chèn dữ liệu từ nhiều bảng vào một bảng MySQL (CROSS JOIN ngầm)

Vấn đề: INSERT INTO SELECT từ 2 bảng nguồn (tạo tổ hợp Cartesian product)

Bảng 1: Tên (Chris, Robert). Bảng 2: Tuổi (23, 26). Cần chèn vào bảng 3 tất cả tổ hợp (Chris-23, Chris-26, Robert-23, Robert-26).

Giải pháp: INSERT INTO ... SELECT FROM table1, table2 (Implicit CROSS JOIN)

Liệt kê nhiều bảng trong FROM cách nhau bởi dấu phẩy = CROSS JOIN (tích Descartes).

1. Tạo 3 bảng

CREATE TABLE Names (Name VARCHAR(20));
INSERT INTO Names VALUES ('Chris'), ('Robert');

CREATE TABLE Ages (Age INT);
INSERT INTO Ages VALUES (23), (26);

CREATE TABLE Students (StudentName VARCHAR(20), StudentAge INT);

2. Chèn tổ hợp từ 2 bảng

INSERT INTO Students (StudentName, StudentAge)
SELECT tbl1.Name, tbl2.Age 
FROM Names tbl1, Ages tbl2;

3. Kết quả (4 hàng = 2x2)

+-------------+------------+
| StudentName | StudentAge |
+-------------+------------+
| Chris       |         23 |
| Robert      |         23 |
| Chris       |         26 |
| Robert      |         26 |
+-------------+------------+

Giải thích

  • FROM Names tbl1, Ages tbl2 – Tích Descartes: mỗi hàng của Names ghép với mỗi hàng của Ages.
  • Kết quả: N x M hàng (N = số hàng Names, M = số hàng Ages).
  • Tương đương FROM Names CROSS JOIN Ages (cú pháp rõ ràng hơn).

Cảnh báo

  • Rất dễ tạo ra lượng dữ liệu khổng lồ vô tình (ví dụ 10.000 x 10.000 = 100 triệu hàng).
  • Luôn kiểm tra số hàng trước: SELECT COUNT(*) FROM Names, Ages;.
  • Nếu cần ghép theo khóa (JOIN có điều kiện), dùng INNER JOIN ... ON ....

Ứng dụng

  • Tạo dữ liệu test tổ hợp (parameterized test).
  • Khởi tạo bảng cấu hình (mọi user x mọi role).
  • Ma trận báo cáo.