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

Multiple Insert / Batch Insert ใน MySQL คำสั่งเดียว

การ 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-tripsParsingTransactionความเร็ว
INSERT แยก 1000 ครั้ง10001000 ครั้ง1000 transactions (default autocommit)ช้ามาก
Batch INSERT 1000 rows11 ครั้ง1 transactionเร็ว 10-100x
LOAD DATA INFILE1Minimal1 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;