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

MySQL รีเซ็ต Auto Increment เริ่มจาก 1 อีกครั้งหลัง DELETE ด้วย TRUNCATE

ใช้ TRUNCATE TABLE แทน DELETE เพื่อลบข้อมูลทั้งหมดและรีเซ็ต AUTO_INCREMENT ให้เริ่มจาก 1 ใหม่

ปัญหาของ DELETE

mysql> DELETE FROM DemoTable1796;  -- ลบข้อมูลทั้งหมด
mysql> INSERT INTO DemoTable1796(StudentName) VALUES('John Doe');
mysql> SELECT * FROM DemoTable1796;
+-----------+-------------+
| StudentId | StudentName |
+-----------+-------------+
|         4 | John Doe    |  -- ❌ Auto Increment ไม่รีเซ็ต (ต่อจาก 3)
+-----------+-------------+

วิธีแก้: ใช้ TRUNCATE TABLE

1. สร้างตารางมี AUTO_INCREMENT

mysql> CREATE TABLE DemoTable1796 (
    StudentId INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    StudentName VARCHAR(20)
);
Query OK, 0 rows affected (0.00 sec)

2. เพิ่มข้อมูล 3 แถว

mysql> INSERT INTO DemoTable1796(StudentName) VALUES('Chris Brown');
mysql> INSERT INTO DemoTable1796(StudentName) VALUES('David Miller');
mysql> INSERT INTO DemoTable1796(StudentName) VALUES('John Doe');

mysql> SELECT * FROM DemoTable1796;
+-----------+--------------+
| StudentId | StudentName  |
+-----------+--------------+
|         1 | Chris Brown  |
|         2 | David Miller |
|         3 | John Doe     |
+-----------+--------------+

3. ลบข้อมูลด้วย TRUNCATE

mysql> TRUNCATE TABLE DemoTable1796;
Query OK, 0 rows affected (0.00 sec)

4. Insert ใหม่ -> ID เริ่มจาก 1 อีกครั้ง

mysql> INSERT INTO DemoTable1796(StudentName) VALUES('John Doe');
mysql> SELECT * FROM DemoTable1796;
+-----------+-------------+
| StudentId | StudentName |
+-----------+-------------+
|         1 | John Doe    |  -- ✅ รีเซ็ตเป็น 1 แล้ว
+-----------+-------------+

เปรียบเทียบ DELETE vs TRUNCATE

คุณสมบัติDELETETRUNCATE
รีเซ็ต AUTO_INCREMENT❌ ไม่รีเซ็ต✅ รีเซ็ตเป็น 1
Trigger (ON DELETE)✅ ทำงาน❌ ไม่ทำงาน
Rollback (Transaction)✅ ได้ (ใน Transaction)❌ ไม่ได้ (DDL - Implicit Commit)
WHERE Clause✅ รองรับ❌ ไม่รองรับ (ลบทั้งตาราง)
ความเร็วช้ากว่า (Log ทีละแถว)เร็วมาก (Deallocate Data Pages)
Foreign Key Constraintตรวจสอบ FKล้มเหลวถ้ามี FK อ้างอิง

วิธีอื่น: รีเซ็ต AUTO_INCREMENT โดยไม่ลบข้อมูล

ALTER TABLE DemoTable1796 AUTO_INCREMENT = 1;

หมายเหตุ: จะมีผลก็ต่อเมื่อค่าสูงสุดปัจจุบัน < 1 (ตารางว่าง) มิฉะนั้นจะเซ็ตเป็น MAX(id)+1

สรุป

ต้องการลบทุกข้อมูลและรีเซ็ต ID ให้เริ่มจาก 1 ใช้ TRUNCATE TABLE (เร็ว แต่อย่าใช้ถ้ามี FK หรือต้องการ Trigger) หากต้องการลบบางส่วน ใช้ DELETE แล้วค่อย ALTER TABLE ... AUTO_INCREMENT = 1 (ตารางต้องว่าง)