การ "รีเซ็ต Primary Key" มักหมายถึงการตั้งค่า AUTO_INCREMENT กลับเป็น 1 หลังจากลบข้อมูลทั้งหมด (TRUNCATE) หรือต้องการเริ่มนับใหม่
รูปแบบคำสั่ง
ALTER TABLE yourTableName AUTO_INCREMENT = 1;
ตัวอย่างขั้นตอน
1. สร้างตารางพร้อม AUTO_INCREMENT
mysql> CREATE TABLE ResetPrimaryKey (
-> Id INT AUTO_INCREMENT,
-> PRIMARY KEY(Id)
-> );
Query OK, 0 rows affected (0.59 sec)
2. เพิ่มข้อมูล 4 แถว
mysql> INSERT INTO ResetPrimaryKey VALUES (), (), (), ();
mysql> SELECT * FROM ResetPrimaryKey;
+----+
| Id |
+----+
| 1 |
| 2 |
| 3 |
| 4 |
+----+
4 rows in set (0.00 sec)
3. ลบข้อมูลทั้งหมด (DELETE - ไม่รีเซ็ต AUTO_INCREMENT)
mysql> DELETE FROM ResetPrimaryKey;
Query OK, 4 rows affected (0.05 sec)
mysql> INSERT INTO ResetPrimaryKey VALUES ();
mysql> SELECT * FROM ResetPrimaryKey;
+----+
| Id |
+----+
| 5 | -- เริ่มจาก 5 (ต่อจาก 4) ไม่ได้รีเซ็ต!
+----+
1 row in set (0.00 sec)
4. รีเซ็ต AUTO_INCREMENT = 1
mysql> ALTER TABLE ResetPrimaryKey AUTO_INCREMENT = 1;
Query OK, 0 rows affected (0.21 sec)
mysql> INSERT INTO ResetPrimaryKey VALUES ();
mysql> SELECT * FROM ResetPrimaryKey;
+----+
| Id |
+----+
| 5 |
| 1 | -- เริ่มจาก 1 ใหม่
+----+
2 rows in set (0.00 sec)
วิธีที่ดีกว่า: ใช้ TRUNCATE TABLE
TRUNCATE TABLE ResetPrimaryKey;
TRUNCATE จะ:
- ลบข้อมูลทั้งหมด
- รีเซ็ต
AUTO_INCREMENTเป็น 1 อัตโนมัติ - เร็วกว่า DELETE มาก (Deallocate Data Pages)
- ไม่ยิง ON DELETE Trigger
ตรวจสอบค่า AUTO_INCREMENT ปัจจุบัน
mysql> DESC ResetPrimaryKey;
+-------+---------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+----------------+
| Id | int(11) | NO | PRI | NULL | auto_increment |
+-------+---------+------+-----+---------+----------------+
1 row in set (0.11 sec)
SHOW TABLE STATUS LIKE 'ResetPrimaryKey';
-- ดูค่า Auto_increment ในคอลัมน์ Auto_increment
ข้อควรระวัง
- ไม่สามารถตั้งค่าต่ำกว่า MAX(id) + 1 ได้ - MySQL จะปรับอัตโนมัติ
- Foreign Key: หากตารางอื่นอ้างอิง PK นี้ ไม่สามารถ TRUNCATE ได้ (ต้อง DISABLE FK CHECKS ก่อน)
- Replication: AUTO_INCREMENT รีเซ็ตอาจทำให้ Slave Out-of-sync หากไม่ระวัง
- Production: ห้ามรีเซ็ต PK ใน Production ที่มีข้อมูลจริง (จะทำให้ ID ชนกัน)
กรณีต้องการรีเซ็ตแต่มี FK
SET FOREIGN_KEY_CHECKS = 0;
TRUNCATE TABLE parent_table;
TRUNCATE TABLE child_table;
SET FOREIGN_KEY_CHECKS = 1;
⚠️ ใช้ด้วยความระมัดระวังมาก ใน Maintenance Window เท่านั้น