คำสั่ง TRUNCATE TABLE ใช้ลบข้อมูล ทั้งหมด ในตารางอย่างรวดเร็ว และรีเซ็ตค่า AUTO_INCREMENT กลับเป็นค่าเริ่มต้น
รูปแบบคำสั่ง
TRUNCATE TABLE yourTableName;
ตัวอย่างการใช้งาน
1. สร้างตารางและเพิ่มข้อมูล
mysql> CREATE TABLE TruncateTableDemo (
-> BookId INT,
-> BookName VARCHAR(200)
-> );
Query OK, 0 rows affected (0.54 sec)
mysql> INSERT INTO TruncateTableDemo VALUES
-> (1001, 'C in Depth'),
-> (1002, 'The C++ Programming'),
-> (1003, 'Let us C');
2. ดูข้อมูลก่อนลบ
mysql> SELECT * FROM TruncateTableDemo;
+--------+---------------------+
| BookId | BookName |
+--------+---------------------+
| 1001 | C in Depth |
| 1002 | The C++ Programming |
| 1003 | Let us C |
+--------+---------------------+
3 rows in set (0.00 sec)
3. ลบข้อมูลทั้งหมดด้วย TRUNCATE
mysql> TRUNCATE TABLE TruncateTableDemo;
Query OK, 0 rows affected (0.93 sec)
4. ตรวจสอบว่าข้อมูลหายหมด
mysql> SELECT * FROM TruncateTableDemo;
Empty set (0.00 sec)
TRUNCATE TABLE vs DELETE FROM
| คุณสมบัติ | TRUNCATE TABLE | DELETE FROM |
|---|---|---|
| ความเร็ว | ⚡ เร็วมาก (Deallocate data pages) | 🐢 ช้ากว่า (ลบแถวทีละแถว) |
| AUTO_INCREMENT | ✅ รีเซ็ตเป็นค่าเริ่มต้น | ❌ ไม่รีเซ็ต |
| WHERE Clause | ❌ ไม่รองรับ | ✅ รองรับ |
| Trigger (ON DELETE) | ❌ ไม่ยิง Trigger | ✅ ยิง Trigger |
| Rollback ได้หรือไม่ | ❌ ไม่ได้ (DDL - Implicit Commit) | ✅ ได้ (DML) |
| Foreign Key Constraint | ❌ ล้มเหลวถ้ามี FK อ้างอิง | ✅ ทำงานได้ (ถ้า ON DELETE CASCADE) |
เมื่อไหร่ควรใช้ TRUNCATE
- ล้างข้อมูลทั้งตารางเพื่อโหลดข้อมูลใหม่ (ETL, Staging table)
- รีเซ็ต AUTO_INCREMENT ให้เริ่มจาก 1 อีกครั้ง
- ตารางขนาดใหญ่ที่ต้องการลบเร็วที่สุด
เมื่อไหร่ควรใช้ DELETE
- ลบเฉพาะบางแถว (มี WHERE)
- ต้องการยิง Trigger
- ต้องการ Rollback ได้
- มี Foreign Key อ้างอิงถึงตารางนี้