MySQL - ฉันสามารถแทรกคำสั่ง INSERT เดียวได้กี่แถว


คำตอบ:


94

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

แต่ถ้าคุณฮาร์ดโค้ดค่าโดยใช้INSERT ... VALUESรูปแบบจะมีข้อ จำกัด ว่าคำสั่งของคุณมีขนาดใหญ่ / ยาวแค่ไหน: max_allowed_packetซึ่งจำกัดความยาวของคำสั่ง SQL ที่ไคลเอ็นต์ส่งไปยังเซิร์ฟเวอร์ฐานข้อมูลและจะส่งผลต่อการสืบค้นทุกประเภท และไม่เพียง แต่สำหรับคำสั่ง INSERT


47

ตามหลักการแล้ว Mysql อนุญาตให้สร้างแถวได้ไม่ จำกัด ในการแทรกครั้งเดียว (พร้อมกัน) แต่เมื่อ a

ไคลเอนต์ MySQL หรือเซิร์ฟเวอร์ mysqld ได้รับแพ็กเก็ตที่มีขนาดใหญ่กว่า max_allowed_packet ไบต์ทำให้แพ็กเก็ตมีข้อผิดพลาดมากเกินไปและปิดการเชื่อมต่อ

หากต้องการดูค่าเริ่มต้นสำหรับตัวแปร max_allowed_packet ให้รันคำสั่งต่อไปนี้ใน MySQL:

show variables like 'max_allowed_packet';

การติดตั้ง MySQL มาตรฐานมีค่าเริ่มต้นคือ 1048576 ไบต์ (1MB) สามารถเพิ่มได้โดยตั้งค่าให้สูงขึ้นสำหรับเซสชันหรือการเชื่อมต่อ

ค่านี้ตั้งค่าเป็น 500MB สำหรับทุกคน (นั่นคือความหมายของ GLOBAL):

SET GLOBAL max_allowed_packet=524288000;

ตรวจสอบการเปลี่ยนแปลงของคุณในเทอร์มินัลใหม่ด้วยการเชื่อมต่อใหม่:

show variables like 'max_allowed_packet';

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


12
500 MB ไม่ได้ไม่มีที่สิ้นสุด มันใหญ่กว่าค่าเริ่มต้นมาก แต่ก็ยังไม่สิ้นสุด
Carlos2W

1
คำถาม: ขีด จำกัด นี้มีไว้เพื่ออะไร? แบบสอบถามเอง? สิ่งที่เกี่ยวกับข้อมูลผูกเมื่อดำเนินการคำสั่ง? ฉันจะปลอดภัยได้strlen($query_with_questionmarks) < $max_alloweed_packetหรือไม่?
pilat

หากคุณพยายามตั้งค่าเป็นค่าที่ใหญ่ที่สุดเท่าที่จะเป็นไปได้นั่นคือ 1GB ซึ่งจะมีลักษณะดังนี้: SET GLOBAL max_allowed_packet = 1073741824
PHP Guru



7

คุณจะถึงขีด จำกัด max_allowed_packet และ

ข้อผิดพลาด: 1390 คำสั่งที่เตรียมไว้มีตัวยึดตำแหน่งมากเกินไป

คุณสามารถใส่ตัวยึดตำแหน่ง 65535 ในหนึ่ง sql ได้ดังนั้นหากคุณมีสองคอลัมน์ในหนึ่งแถวคุณสามารถแทรก 32767 แถวในหนึ่ง sql

การนำเข้า 50K + Records ใน MySQL ให้ข้อผิดพลาดทั่วไป: 1390 คำสั่ง Prepared มีตัวยึดตำแหน่งมากเกินไป


6

คุณสามารถแทรกแถวได้ไม่ จำกัด ด้วยคำสั่ง INSERT หนึ่งคำสั่ง ตัวอย่างเช่นคุณสามารถเรียกใช้กระบวนงานที่เก็บไว้ซึ่งมีการวนซ้ำเป็นพัน ๆ ครั้งในแต่ละครั้งที่เรียกใช้แบบสอบถาม INSERT

หรือ INSERT ของคุณสามารถทริกเกอร์ทริกเกอร์ซึ่งตัวมันเองดำเนินการแทรก ซึ่งทริกเกอร์อื่น และอื่น ๆ

ไม่ได้ขึ้นอยู่กับจำนวนชุดค่า ไม่ขึ้นอยู่กับจำนวนไบต์

มีขีด จำกัด ว่าวงเล็บของคุณจะซ้อนกันลึกเพียงใดและขีด จำกัด ของระยะเวลาในคำสั่งรวมของคุณ ทั้งสองอย่างนี้อ้างอิงแดกดันบน thedailywtf.com อย่างไรก็ตามทั้งสองวิธีที่ฉันกล่าวถึงข้างต้นสามารถหลีกเลี่ยงข้อ จำกัด เหล่านี้ได้


ตัวอย่างของคุณใช้สำหรับการเรียกใช้ INSERT หลายรายการและไม่ได้แสดงเกี่ยวกับการแทรกหลายแถวในคำสั่ง INSERT เดียว ..
Lukman

@Lukman: แบบสอบถาม INSERT หนึ่งรายการสามารถส่งผลให้ INSERTS หลายรายการกดปุ่มฐานข้อมูล เป็นเพียงเรื่องของใครจะนับอะไร
Borealid

2
จริง แต่ตัวอย่างแรกของคุณแสดงเกี่ยวกับการเรียกใช้แบบสอบถามในลูปโดยแต่ละลูปเรียกใช้คำสั่ง INSERT หนึ่งคำสั่งและไม่มีข้อความใด ๆ เกี่ยวกับคำสั่ง INSERT ที่แทรกหลายแถว เป็นเพียงประเด็นสำคัญ
Lukman

ไม่มีใครทำอะไรได้ไม่สิ้นสุด มีทรัพยากร จำกัด อยู่เสมอ
Adrien

สิ่งนี้ใช้กับคำสั่ง SELECT ... FROM ด้วยหรือไม่? ฉันหมายความว่าถ้าข้อมูลถูกแทรกในตอนแรกด้วย max_allowed_packet แล้วสิ่งนี้ไม่ควรเลือกเบียร์ด้วยหรือไม่? ฉันไม่เข้าใจว่าทำไมมันถึงใช้กับข้อความอื่น ๆ ทั้งหมดเหมือนที่ผู้โพสต์คนอื่น ๆ กล่าวไว้เมื่อแรกต้องแทรกก่อนสิ่งอื่นใด
Thielicious

2

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


2

ถูก จำกัด โดย max_allowed_packet
คุณสามารถระบุได้โดยใช้: mysqld --max_allowed_packet=32M เป็นค่าเริ่มต้น 16M
คุณยังสามารถระบุใน my.cnf ใน / etc / mysql /

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