ตัวนับการเพิ่มอัตโนมัติถูกเก็บไว้ในหน่วยความจำหลักเท่านั้นไม่ใช่ในดิสก์
http://dev.mysql.com/doc/refman/4.1/en/innodb-auto-increment-handling.html
ด้วยเหตุนี้เมื่อเซอร์วิส (หรือเซิร์ฟเวอร์) รีสตาร์ทสิ่งต่อไปนี้จะเกิดขึ้น:
หลังจากเซิร์ฟเวอร์เริ่มทำงานสำหรับการแทรกครั้งแรกลงในตาราง t InnoDB จะดำเนินการเทียบเท่ากับคำสั่งนี้: SELECT MAX (ai_col) จาก t สำหรับการอัพเดท;
InnoDB จะเพิ่มขึ้นทีละหนึ่งค่าที่เรียกคืนโดยคำสั่งและกำหนดให้กับคอลัมน์และไปที่ตัวนับการเพิ่มขึ้นอัตโนมัติสำหรับตาราง หากตารางว่างเปล่า InnoDB จะใช้ค่า 1
ดังนั้นในภาษาอังกฤษแบบธรรมดาหลังจากที่บริการ MySQL เริ่มต้นมันก็ไม่รู้ว่ามูลค่าการเพิ่มอัตโนมัติสำหรับตารางของคุณควรเป็นเท่าไหร่ ดังนั้นเมื่อคุณแทรกแถวแรกพบค่าสูงสุดของเขตข้อมูลที่ใช้การเพิ่มขึ้นอัตโนมัติเพิ่ม 1 ให้กับค่านี้และใช้ค่าผลลัพธ์ หากไม่มีแถวมันจะเริ่มต้นที่ 1
นี่เป็นปัญหาสำหรับเราเนื่องจากเราใช้คุณลักษณะการเพิ่มอัตโนมัติของตารางและ mysql เพื่อจัดการรหัสอย่างเรียบร้อยในสภาพแวดล้อมแบบมัลติเธรดซึ่งผู้ใช้จะถูกนำไปยังไซต์การชำระเงินของบุคคลที่สามอีกครั้ง ดังนั้นเราต้องทำให้แน่ใจว่า ID ที่บุคคลที่สามได้รับและส่งกลับมาให้เรานั้นไม่เหมือนใครและจะยังคงเป็นเช่นนั้น (และแน่นอนว่ามีความเป็นไปได้ที่ผู้ใช้จะยกเลิกธุรกรรมหลังจากที่ถูกเปลี่ยนเส้นทาง)
ดังนั้นเราจึงสร้างแถวรับค่าเพิ่มอัตโนมัติสร้างลบแถวเพื่อรักษาตารางให้สะอาดและส่งต่อค่าไปยังไซต์การชำระเงิน สิ่งที่เราทำเพื่อแก้ไขปัญหาวิธีที่ InnoDB จัดการกับค่า AI คือสิ่งต่อไปนี้:
$query = "INSERT INTO transactions_counter () VALUES ();";
mysql_query($query);
$transactionId = mysql_insert_id();
$previousId = $transactionId - 1;
$query = "DELETE FROM transactions_counter WHERE transactionId='$previousId';";
mysql_query($query);
สิ่งนี้จะช่วยให้ transactionId ล่าสุดที่สร้างขึ้นเป็นแถวในตารางเสมอโดยไม่ทำให้ตารางไม่จำเป็น
หวังว่าจะช่วยให้คนอื่นที่อาจทำงานนี้
แก้ไข (2018-04-18) :
ดังที่กลเม็ดด้านล่างนี้ปรากฏว่าพฤติกรรมของสิ่งนี้ได้รับการแก้ไขใน MySQL 8.0+
https://dev.mysql.com/worklog/task/?id=6204
ถ้อยคำในบันทึกการทำงานนั้นผิดพลาดมากที่สุด แต่ปรากฏว่า InnoDB ในเวอร์ชันที่ใหม่กว่าเหล่านี้สนับสนุนค่า autoinc ที่คงที่ตลอดการรีบูต
-Gremio