Technique: จองค่า Auto Increment ด้วย Transaction + Rollback
ใช้ Transaction Insert แล้ว Rollback เพื่อ "ข้าม" ค่า Auto Increment ไปข้างหน้า
ไวยากรณ์
START TRANSACTION; INSERT INTO yourTable VALUES (), (), (), (); ROLLBACK; SELECT LAST_INSERT_ID() INTO @variable;
ตัวอย่าง
CREATE TABLE reservingAutoIncrementDemo (
UserId INT NOT NULL AUTO_INCREMENT PRIMARY KEY
);
START TRANSACTION;
INSERT INTO reservingAutoIncrementDemo VALUES (), (), (), ();
SELECT * FROM reservingAutoIncrementDemo; -- ได้ ID 1,2,3,4
ROLLBACK;
ตรวจสอบค่าที่จองไว้
SELECT LAST_INSERT_ID() INTO @IncrementedValue; SELECT @IncrementedValue;
+-------------------+ | @IncrementedValue | +-------------------+ | 1 | +-------------------+
การทำงาน
- INSERT 4 แถว → Auto Increment กระโดดเป็น 5
- ROLLBACK → ข้อมูลหาย แต่ Auto Increment Counter ไม่ย้อนกลับ (InnoDB behavior)
- LAST_INSERT_ID() = 1 (ค่าแรกของชุดที่ Insert)
- Insert ถัดไปจะเริ่มที่ 5
กรณีใช้งาน
- จองช่วง ID สำหรับระบบภายนอก
- ป้องกันชน ID ระหว่าง Shard/Cluster
- สร้าง Gap เพื่อการจัดกลุ่มข้อมูล
ข้อควรระวัง
InnoDB ไม่ Reuse Auto Increment หลัง Rollback (คงที่ตั้งแต่ MySQL 8.0) MyISAM อาจ Reuse ได้