วิธีการแทรกแบทช์ใน MySQL


148

ฉันมีบันทึกจำนวน 1 รายการที่ต้องป้อนลงในตาราง วิธีที่ดีที่สุดในการทำแบบสอบถามคืออะไร? ฉันควรทำวนรอบและแทรกหนึ่งระเบียนต่อการวนซ้ำหรือไม่ หรือมีวิธีที่ดีกว่า


1
โปรดอ่านเอกสารประกอบสำหรับคำสั่งหรือฟังก์ชั่นก่อนที่จะพยายามที่จะใช้มัน INSERTรองรับสิ่งนี้ !
Lightness Races ในวงโคจร

3
หากคุณมีบันทึกจำนวนมากและสามารถจัดรูปแบบเป็นไฟล์ CSV ให้ตรวจสอบคำสั่งโหลดข้อมูล INFILE หรือคำสั่ง mysqlimport
squawknull

สำหรับเร็กคอร์ดLOAD DATAเป็นคำสั่งที่มีความยืดหยุ่นสูงซึ่งไม่ต้องการอินพุต CSV; รูปแบบข้อความใด ๆ ที่จะทำและมีจำนวนของพารามิเตอร์ที่เป็นประโยชน์สำหรับการแยกและจัดการข้อมูลอินพุต นี่เป็นวิธีที่เร็วที่สุดในการโหลดข้อมูลไปยังฐานข้อมูลท้องถิ่น ยังไม่ชัดเจนว่า "ดีที่สุด" ข้างต้นหมายถึงอะไร: นั่นคือความเรียบง่าย (ใช้คำสั่ง INSERT) หรือไม่
EdwardGarson

คำตอบ:


298

จากคู่มือ MySQL

คำสั่ง INSERT ที่ใช้ไวยากรณ์ค่าสามารถแทรกหลายแถว ในการทำเช่นนี้ให้รวมรายการคอลัมน์หลายค่าโดยแต่ละรายการจะอยู่ในวงเล็บและคั่นด้วยเครื่องหมายจุลภาค ตัวอย่าง:

INSERT INTO tbl_name (a,b,c) VALUES(1,2,3),(4,5,6),(7,8,9);

7
สิ่งนี้ช้ากว่าโหลด Data Infile หรือไม่
srchulo

ไวยากรณ์ในการเขียนคำสั่งแทรกนี้ในกระบวนงานที่เก็บคืออะไร
Nitin Sawant

@Nitin จะไม่เป็นไวยากรณ์เดียวกันหรือไม่ .. ??? นั่นคือสิ่งที่ฉันจะทำใน SQL Server ต่อไป
โฆษณา

13
โปรดทราบว่าในขณะที่คำถามมีป้ายกำกับว่า "วิธีการแทรกแบทช์ " คำตอบนี้เป็นจริงแทรกจำนวนมาก เป็นกลุ่มมักจะเร็วกว่าดูคำถามนี้
Mike Demenok

2
@Koffeehaus ตามคำตอบนี้จาก @Lukman จำนวนค่า / แถวที่สามารถแทรกได้จะถูก จำกัด โดยmax_allowed_packet
Sepster

22

ส่วนใหญ่คุณไม่ได้ทำงานในไคลเอนต์ MySQL และคุณควรแบตช์แทรกเข้าด้วยกันโดยใช้ API ที่เหมาะสม

เช่นใน JDBC:

connection con.setAutoCommit(false); 
PreparedStatement prepStmt = con.prepareStatement("UPDATE DEPT SET MGRNO=? WHERE DEPTNO=?");
prepStmt.setString(1,mgrnum1);                 
prepStmt.setString(2,deptnum1);
prepStmt.addBatch();

prepStmt.setString(1,mgrnum2);                        
prepStmt.setString(2,deptnum2);
prepStmt.addBatch();

int [] numUpdates=prepStmt.executeBatch();

http://publib.boulder.ibm.com/infocenter/db2luw/v8/index.jsp?topic=/com.ibm.db2.udb.doc/ad/tjvbtupd.htm


5
บล็อกที่ดีในการแทรกแบบกลุ่ม (ใน Java แต่เกี่ยวข้องกับภาษาใด ๆ ): viralpatel.net/blogs/batch-insert-in-java-jdbc
Kangur


6

โหลดแบบสอบถามข้อมูล infile เป็นตัวเลือกที่ดีกว่ามาก แต่เซิร์ฟเวอร์บางตัวเช่น godaddy จำกัด ตัวเลือกนี้ไว้ในการโฮสต์ที่ใช้ร่วมกันดังนั้นเหลือเพียงสองตัวเลือกจากนั้นหนึ่งบันทึกจะถูกแทรกในทุกการวนซ้ำหรือการแทรกแบทช์ จำนวนตัวละครที่ตั้งค่าใน mysql แล้วแบบสอบถามของคุณจะผิดพลาดดังนั้นฉันขอแนะนำให้ใส่ข้อมูลในชุดข้อมูลด้วยชุดการแทรกซึ่งจะช่วยลดจำนวนการเชื่อมต่อที่สร้างด้วยฐานข้อมูลได้


1
วิธีการเกี่ยวกับLOAD DATA LOCAL INFILE '/users/name/txt.file'
double_j

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.