Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

เพิ่มหลายเรคคอร์ดใน MySQL คำสั่งเดียวด้วย INSERT ... VALUES

MySQL รองรับการ INSERT หลายแถวในคำสั่งเดียว (Multi-row INSERT) โดยใช้ Syntax VALUES (...), (...), ... ซึ่งเร็วกว่า INSERT แยกหลายคำสั่งมาก

Syntax

INSERT INTO table_name (col1, col2, ...)
VALUES (val1, val2, ...), (val1, val2, ...), ...;

สร้างตารางและ INSERT 4 แถวทีเดียว

mysql> create table DemoTable (
    Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
    Value1 int, Value2 int, Value3 int
);
mysql> insert into DemoTable(Value1,Value2,Value3) 
values(10,20,40),(100,148,120),(150,670,1000),(100000,200000,409999);

ผลลัพธ์

+----+--------+--------+--------+
| Id | Value1 | Value2 | Value3 |
+----+--------+--------+--------+
| 1  | 10     | 20     | 40     |
| 2  | 100    | 148    | 120    |
| 3  | 150    | 670    | 1000   |
| 4  | 100000 | 200000 | 409999 |
+----+--------+--------+--------+

ประโยชน์ของ Multi-row INSERT

  • เร็วกว่า 10-100 เท่า ของ INSERT แยกคำสั่ง (Single Round-trip)
  • Atomic - ทำสำเร็จทั้งหมดหรือ Rollback ทั้งหมด
  • ลด Network Round-trips - สำคัญเมื่อ Latency สูง
  • Binary Log ขนาดเล็กลง - Replication เร็วขึ้น

ข้อจำกัด

  • max_allowed_packet - ขนาด Packet สูงสุด (Default 4MB/64MB) หากเกินจะ Error
  • จำนวนแถวเยอะมาก (>1000) ควรแบทช์ (Batch) ทีละ 500-1000 แถว
  • ON DUPLICATE KEY UPDATE ใช้ได้กับ Multi-row INSERT

ตัวอย่างพร้อม ON DUPLICATE KEY UPDATE

INSERT INTO users (id, name, email, login_count)
VALUES (1, 'John', 'john@example.com', 1),
       (2, 'Jane', 'jane@example.com', 1)
ON DUPLICATE KEY UPDATE 
    login_count = login_count + 1,
    name = VALUES(name);

เปรียบเทียบประสิทธิภาพ

วิธี1000 แถว10000 แถวหมายเหตุ
INSERT แยก (Loop)~2-5 วินาที~20-50 วินาทีRound-trip ทุกแถว
Multi-row INSERT~0.05-0.1 วินาที~0.5-1 วินาทีSingle Round-trip
LOAD DATA INFILE~0.01-0.03 วินาที~0.1-0.3 วินาทีเร็วที่สุด สำหรับไฟล์

แนะนำ: ใช้ LOAD DATA INFILE สำหรับ Import ข้อมูลมาก