1. TRUNCATE คืออะไร
แนวคิดพื้นฐานของ TRUNCATE
คำสั่ง TRUNCATE ใน MySQL เป็นคำสั่งที่ใช้เพื่อลบข้อมูลทั้งหมดในตารางในครั้งเดียว แตกต่างจากคำสั่ง DELETE ที่ลบข้อมูลทีละแถว TRUNCATE จะทำการสร้างตารางขึ้นใหม่ภายในเพื่อทำการลบข้อมูล ดังนั้นจึงมีประสิทธิภาพมากเมื่อจำเป็นต้องลบข้อมูลจำนวนมากอย่างรวดเร็ว
โครงสร้างพื้นฐาน
โครงสร้างพื้นฐานของคำสั่ง TRUNCATE คือ:
TRUNCATE TABLE ชื่อตาราง;
คำสั่งนี้จะลบข้อมูลทุกแถวในตารางที่ระบุ และตารางจะกลับสู่สถานะเริ่มต้น อย่างไรก็ตาม ข้อมูลที่ถูกลบไปแล้วจะไม่สามารถกู้คืนได้ ดังนั้นควรใช้อย่างระมัดระวัง
ตัวอย่าง: การใช้งานพื้นฐาน
ตัวอย่างต่อไปนี้เป็นการสร้างตารางชื่อ users
และใช้ TRUNCATE เพื่อลบข้อมูลทั้งหมด
CREATE TABLE users (
id INT AUTO_INCREMENT,
name VARCHAR(100),
PRIMARY KEY (id)
);
INSERT INTO users (name) VALUES ('Taro'), ('Hanako'), ('Jiro');
-- ใช้ TRUNCATE
TRUNCATE TABLE users;
-- ตารางจะว่างเปล่า และ AUTO_INCREMENT จะถูกรีเซ็ต
ในตัวอย่างนี้ ข้อมูลในตารางทั้งหมดถูกลบ และเมื่อเพิ่มข้อมูลใหม่ ค่า id
จะเริ่มจาก 1 อีกครั้ง

2. ความแตกต่างระหว่าง TRUNCATE และ DELETE
ความเร็วและประสิทธิภาพ
TRUNCATE ถูกออกแบบมาเพื่อลบข้อมูลทั้งตาราง จึงเร็วกว่า DELETE อย่างมาก เนื่องจาก DELETE จะลบข้อมูลทีละแถว ซึ่งอาจช้าเมื่อจำนวนแถวมีมาก ในทางตรงกันข้าม TRUNCATE จะสร้างตารางใหม่ภายใน ทำให้เหมาะกับการลบข้อมูลจำนวนมาก
ตัวอย่าง: เปรียบเทียบประสิทธิภาพ
หากต้องการลบข้อมูลหลายล้านแถว ด้วย DELETE จะเขียนดังนี้:
DELETE FROM users WHERE condition;
แต่หากใช้ TRUNCATE จะเขียนได้ดังนี้:
TRUNCATE TABLE users;
ความแตกต่างจะเห็นได้ชัดเจนในตารางที่มีขนาดใหญ่มาก โดย DELETE ใช้เวลานาน แต่ TRUNCATE สามารถทำงานได้ทันที
ความแตกต่างด้าน Rollback
TRUNCATE ไม่สามารถ rollback ได้ เมื่อรันแล้วข้อมูลจะถูกลบถาวรและไม่สามารถกู้คืนได้ ในขณะที่ DELETE หากใช้ในธุรกรรม (transaction) สามารถ rollback ได้หากเกิดข้อผิดพลาด
ความแตกต่างด้านการลบแบบเลือก
DELETE สามารถใช้ WHERE
เพื่อลบข้อมูลตามเงื่อนไขได้ แต่ TRUNCATE ไม่สามารถทำได้ เช่น หากต้องการลบเฉพาะผู้ใช้บางราย:
DELETE FROM users WHERE id = 1;
ดังนั้น หากต้องการลบเฉพาะบางแถว DELETE จึงเหมาะสมกว่า
3. ผลกระทบของ TRUNCATE ต่อ AUTO_INCREMENT
การรีเซ็ต AUTO_INCREMENT
เมื่อใช้ TRUNCATE นอกจากจะลบข้อมูลทั้งหมดแล้ว ค่า AUTO_INCREMENT ก็จะถูกรีเซ็ตกลับไปเริ่มที่ 1 ตัวอย่างเช่น หากเพิ่มข้อมูลใหม่ลงในตาราง users
:
INSERT INTO users (name) VALUES ('Ken');
-- id จะเริ่มจาก 1 อีกครั้ง
การรีเซ็ตนี้อาจมีประโยชน์ในบางกรณี แต่หาก ID ถูกใช้เป็น foreign key ในตารางอื่น ควรระวังเพื่อหลีกเลี่ยงความไม่สอดคล้องของข้อมูล
4. ข้อควรระวังในการใช้ TRUNCATE
ไม่สามารถกู้คืนข้อมูลได้
ความเสี่ยงใหญ่ที่สุดของ TRUNCATE คือข้อมูล ไม่สามารถกู้คืนได้ หากลบข้อมูลสำคัญไปโดยไม่ตั้งใจ ดังนั้นควรสำรองข้อมูลก่อนทุกครั้ง
ข้อจำกัดของ Foreign Key
TRUNCATE ไม่สามารถใช้กับตารางที่มี Foreign Key constraint หากต้องการใช้ ต้องลบหรือแก้ไข constraint ก่อน
ข้อจำกัดด้านสิทธิ์การใช้งาน
การใช้ TRUNCATE ต้องมีสิทธิ์ DROP TABLE หากผู้ใช้ไม่มีสิทธิ์นี้ จะไม่สามารถรันคำสั่งได้ ดังนั้นควรตรวจสอบสิทธิ์ก่อนใช้งาน

5. การเลือกใช้ TRUNCATE และ DELETE
เมื่อควรใช้ TRUNCATE
เหมาะเมื่อจำเป็นต้องลบข้อมูลทั้งหมดในตารางอย่างรวดเร็ว โดยเฉพาะเมื่ออยากรีเซ็ต AUTO_INCREMENT เช่นในกรณีทดสอบที่ต้องการรีเซ็ตข้อมูล
เมื่อควรใช้ DELETE
หากต้องการลบข้อมูลบางส่วนตามเงื่อนไข หรือจำเป็นต้องให้ trigger ทำงาน DELETE จะเหมาะสมกว่า เพราะสามารถลบแบบเลือกได้
6. แนวทางปฏิบัติที่ดีที่สุดในการใช้ TRUNCATE อย่างปลอดภัย
ความสำคัญของการสำรองข้อมูล
ก่อนใช้ TRUNCATE ควรสำรองข้อมูลเสมอ เพราะหากลบผิดพลาดจะไม่สามารถกู้คืนได้ โดยเฉพาะในระบบ production
การทดสอบในสภาพแวดล้อมจำลอง
ควรทดสอบใน environment ที่ไม่ใช่ production ก่อน เพื่อให้แน่ใจว่าคำสั่งทำงานถูกต้อง
การจัดการ AUTO_INCREMENT
เนื่องจาก TRUNCATE จะรีเซ็ต AUTO_INCREMENT ควรตรวจสอบความสัมพันธ์กับตารางอื่น เพื่อหลีกเลี่ยงปัญหาความไม่สอดคล้องของข้อมูล