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

รีเซ็ตคอลัมน์ AUTO_INCREMENT ใน MySQL ด้วย TRUNCATE TABLE

วิธีที่ง่ายที่สุด: TRUNCATE TABLE

TRUNCATE TABLE ลบข้อมูลทั้งหมดและรีเซ็ต AUTO_INCREMENT กลับเป็น 1:

mysql> CREATE TABLE DemoTable1888 (
    Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY
);

mysql> INSERT INTO DemoTable1888 VALUES(), (), ();  -- Id: 1, 2, 3

mysql> SELECT * FROM DemoTable1888;
+----+
| Id |
+----+
|  1 |
|  2 |
|  3 |
+----+

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

mysql> INSERT INTO DemoTable1888 VALUES(), ();  -- Id: 1, 2 (Reset!)

mysql> SELECT * FROM DemoTable1888;
+----+
| Id |
+----+
|  1 |
|  2 |
+----+

TRUNCATE vs DELETE

คุณสมบัติTRUNCATE TABLEDELETE FROM table
ความเร็วเร็วมาก (Drop + Recreate)ช้ากว่า (Row by Row)
AUTO_INCREMENTReset เป็น 1ไม่ Reset
Triggerไม่ FireFire ON DELETE
Rollbackไม่ได้ (Implicit Commit)ได้ (ใน Transaction)
WHERE Clauseไม่รองรับรองรับ
Foreign KeyError ถ้ามี FK ReferenceError/Restrict ตาม FK

วิธีอื่น: ALTER TABLE AUTO_INCREMENT

-- รีเซ็ตเป็นค่าเฉพาะ (ไม่ลบข้อมูล)
ALTER TABLE DemoTable1888 AUTO_INCREMENT = 1;

-- ตั้งค่าเริ่มต้นใหม่
ALTER TABLE DemoTable1888 AUTO_INCREMENT = 1000;

ข้อควรระวัง

  • TRUNCATE ทำ Implicit Commit → ไม่ Rollback ได้
  • ถ้ามี Foreign Key Reference → ต้อง Drop FK ก่อน หรือใช้ DELETE
  • InnoDB: TRUNCATE ทำ Full Table Lock
  • Partitioned Table: TRUNCATE ทำงานได้ (MySQL 5.7+)

กรณีต้องการ Reset แต่เก็บข้อมูลไว้

-- 1. สร้างตารางใหม่
CREATE TABLE new_table LIKE old_table;
ALTER TABLE new_table AUTO_INCREMENT = 1;
INSERT INTO new_table SELECT * FROM old_table;
RENAME TABLE old_table TO backup_table, new_table TO old_table;