ใน MySQL Engine InnoDB ไม่สามารถตั้งค่า AUTO_INCREMENT ต่ำกว่าค่าสูงสุดที่มีอยู่ ได้ ต้องเปลี่ยน Engine เป็น MyISAM จึงจะทำได้ (แต่ MyISAM ไม่รองรับ Transaction/Row Lock)
ข้อจำกัด InnoDB vs MyISAM
| Engine | SET AI ต่ำกว่า MAX | พฤติกรรม |
| InnoDB | ❌ ไม่ได้ | Silent Ignore - ค่า AI ไม่เปลี่ยน |
| MyISAM | ✅ ได้ | Reset เป็น MAX+1 หากค่าต่ำกว่า MAX |
ตัวอย่าง: MyISAM Table
mysql> create table DemoTable (Id int NOT NULL AUTO_INCREMENT PRIMARY KEY) ENGINE='MyISAM';
mysql> insert into DemoTable values(),(),(),(),(),(); -- 6 rows
+----+
| Id |
+----+
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
+----+
ลบ ID 4,5,6
mysql> delete from DemoTable where Id in (4,5,6);
+----+
| Id |
+----+
| 1 |
| 2 |
| 3 |
+----+
ตั้งค่า AUTO_INCREMENT = 4 (ต่ำกว่าเดิมที่เป็น 7)
mysql> alter table DemoTable auto_increment = 4;
INSERT ใหม่ 3 แถว
mysql> insert into DemoTable values(),(),();
ผลลัพธ์: ID ใหม่เริ่มจาก 4
+----+
| Id |
+----+
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
+----+
คำอธิบาย
- หลัง DELETE MAX(Id) = 3
- MyISAM: ALTER AUTO_INCREMENT=4 → ตั้งเป็น MAX+1 = 4
- InnoDB: ALTER AUTO_INCREMENT=4 → ไม่ทำอะไร (คงค่า AI เดิม = 7)
วิธีทำกับ InnoDB (Workaround)
- TRUNCATE TABLE - รีเซ็ต AI เป็น 1 (ลบข้อมูลทั้งหมด)
- Re-create Table - สร้างตารางใหม่ คัดลอกข้อมูล
- ALTER TABLE ... AUTO_INCREMENT = value - ตั้งได้เฉพาะค่า > MAX(Id) ปัจจุบัน
คำเตือน MyISAM
- ไม่รองรับ Transaction (ACID)
- Table-level Lock (Concurrency ต่ำ)
- ไม่มี Foreign Key
- Crash Unsafe - อาจ Corrupt ได้
- ไม่แนะนำใช้ MyISAM สำหรับ Production
MySQL 8.0: ใช้ AUTO_INCREMENT ใน CREATE TABLE
CREATE TABLE new_table (id INT AUTO_INCREMENT PRIMARY KEY) AUTO_INCREMENT = 100;