Có, MySQL hỗ trợ chèn nhiều hàng trong một lệnh INSERT đơn giản bằng cách liệt kê nhiều bộ giá trị.
Cú pháp
INSERT INTO table_name (col1, col2, ...) VALUES (val1, val2, ...), (val1, val2, ...), ...;
Tạo bảng
mysql> CREATE TABLE DemoTable (
-> Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> Value1 INT, Value2 INT, Value3 INT
-> );
INSERT nhiều hàng một lần
mysql> INSERT INTO DemoTable(Value1, Value2, Value3)
-> VALUES (10, 20, 40), (100, 148, 120), (150, 670, 1000), (100000, 200000, 409999);
Query OK, 4 rows affected (0.17 sec) Records: 4 Duplicates: 0 Warnings: 0
Kết quả
mysql> SELECT * FROM DemoTable;
+----+--------+--------+--------+ | Id | Value1 | Value2 | Value3 | +----+--------+--------+--------+ | 1 | 10 | 20 | 40 | | 2 | 100 | 148 | 120 | | 3 | 150 | 670 | 1000 | | 4 | 100000 | 200000 | 409999 | +----+--------+--------+--------+
Ưu điểm so với INSERT riêng lẻ
- Hiệu năng: Chỉ parse/optimize một lần, giảm round-trip network, ghi binlog một lần
- Atomicity: Tất cả hàng thành công hoặc tất cả thất bại (trừ khi dùng
IGNORE) - Auto-increment: Tự động gán ID liên tiếp
Lưu ý
- Giới hạn kích thước packet:
max_allowed_packet(mặc định 4MB/64MB). Với dữ liệu lớn, chia thành nhiều INSERT - Số lượng giá trị mỗi hàng phải khớp với số cột
- Có thể kết hợp với
ON DUPLICATE KEY UPDATEcho upsert hàng loạt
INSERT ... SELECT nhiều hàng
INSERT INTO target_table (col1, col2) SELECT col_a, col_b FROM source_table WHERE condition;
Cách này hiệu quả nhất để sao chép/di chuyển dữ liệu giữa bảng.