การ Insert หลายแถวพร้อมกันด้วย VALUES แบบคั่นจุลภาค
MySQL รองรับการ INSERT หลายแถวในคำสั่งเดียวโดยคั่นแต่ละชุดค่าด้วยจุลภาค เร็วกว่า INSERT แยกหลายคำสั่งมาก
ไวยากรณ์
INSERT INTO yourTableName (col1, col2, ...)
VALUES
(val1_1, val1_2, ...),
(val2_1, val2_2, ...),
(val3_1, val3_2, ...),
...;
ตัวอย่างการใช้งาน
สร้างตาราง:
CREATE TABLE addMultipleValues (
Counter INT NOT NULL
);
Batch Insert 10 แถว:
INSERT INTO addMultipleValues VALUES
(1), (2), (3), (4), (5),
(6), (7), (8), (9), (10);
ผลลัพธ์: Query OK, 10 rows affected (0.27 sec)
ตรวจสอบข้อมูล:
SELECT * FROM addMultipleValues;
+---------+
| Counter |
+---------+
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
| 8 |
| 9 |
| 10 |
+---------+
ตัวอย่างหลายคอลัมน์
INSERT INTO users (username, email, created_at) VALUES
('john', 'john@example.com', NOW()),
('jane', 'jane@example.com', NOW()),
('bob', 'bob@example.com', NOW());
ประสิทธิภาพและ Best Practices
| วิธี | Network Round-trips | Parsing | Transaction | ความเร็ว |
|---|---|---|---|---|
| INSERT แยก 1000 ครั้ง | 1000 | 1000 ครั้ง | 1000 transactions (default autocommit) | ช้ามาก |
| Batch INSERT 1000 rows | 1 | 1 ครั้ง | 1 transaction | เร็ว 10-100x |
| LOAD DATA INFILE | 1 | Minimal | 1 transaction | เร็วที่สุด |
ข้อจำกัดและคำแนะนำ
- Max packet size:
max_allowed_packet(default 4MB/64MB) - batch ใหญ่เกินอาจ fail - แนะนำ batch size: 100-1000 rows ต่อคำสั่ง (ขึ้นอยู่กับ row size)
- Transaction: ห่อด้วย
START TRANSACTION; ... COMMIT;เพื่อ atomicity และความเร็ว - Duplicate Key: ใช้
INSERT IGNOREหรือON DUPLICATE KEY UPDATE
ตัวอย่างพร้อม Transaction
START TRANSACTION;
INSERT INTO logs (message, created_at) VALUES
('Log 1', NOW()),
('Log 2', NOW()),
...
('Log 1000', NOW());
COMMIT;
LOAD DATA INFILE (สำหรับข้อมูลมหาศาล)
LOAD DATA INFILE '/path/file.csv'
INTO TABLE your_table
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 LINES;