Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

รีเซ็ต Primary Key (AUTO_INCREMENT) ใน MySQL ให้เริ่มจาก 1 ใหม่

การ "รีเซ็ต 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 เท่านั้น