อธิบายคำสั่ง TRUNCATE ของ MySQL: ไวยากรณ์, ความแตกต่างจาก DELETE, การรีเซ็ต AUTO_INCREMENT และแนวปฏิบัติที่ดีที่สุด

目次

1. คำสั่ง TRUNCATE คืออะไร?

แนวคิดพื้นฐานของคำสั่ง TRUNCATE

คำสั่ง TRUNCATE ของ MySQL เป็นคำสั่งที่ใช้ลบข้อมูลทั้งหมดในตารางพร้อมกัน ต่างจากคำสั่ง DELETE ที่ลบแถวทีละแถว, TRUNCATE จะลบข้อมูลโดยการสร้างตารางใหม่ภายใน ผลลัพธ์คือมันมีประสิทธิภาพสูงมากเมื่อทำการลบข้อมูลจำนวนมากอย่างมีประสิทธิภาพ

ไวยากรณ์พื้นฐาน

ไวยากรณ์พื้นฐานของคำสั่ง TRUNCATE มีดังต่อไปนี้:

TRUNCATE TABLE table_name;

คำสั่งนี้จะลบแถวทั้งหมดจากตารางที่ระบุและคืนตารางกลับสู่สภาพเริ่มต้น อย่างไรก็ตาม เนื่องจากข้อมูลที่ถูกลบไม่สามารถกู้คืนได้ คำสั่งนี้จึงต้องใช้ด้วยความระมัดระวัง

ตัวอย่าง: การใช้งานพื้นฐาน

ในตัวอย่างต่อไปนี้ จะสร้างตารางชื่อ users และใช้คำสั่ง TRUNCATE เพื่อลบข้อมูลทั้งหมดในตาราง

CREATE TABLE users (
    id INT AUTO_INCREMENT,
    name VARCHAR(100),
    PRIMARY KEY (id)
);

INSERT INTO users (name) VALUES ('Taro'), ('Hanako'), ('Jiro');

-- Execute TRUNCATE
TRUNCATE TABLE users;

-- The table becomes empty, and AUTO_INCREMENT is reset.

ในตัวอย่างนี้ ข้อมูลทั้งหมดในตารางจะถูกลบออก และเมื่อมีการแทรกข้อมูลใหม่ คอลัมน์ 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 ภายในทรานแซกชัน สามารถทำการ Rollback ได้หากเกิดข้อผิดพลาด ทำให้ข้อมูลสามารถกู้คืนได้ นี่เป็นความแตกต่างที่สำคัญในแง่ของความปลอดภัย

ความแตกต่างด้านการลบแบบเลือก

คำสั่ง DELETE ให้คุณลบแถวตามเงื่อนไขที่กำหนดโดยใช้ clause WHERE แต่ TRUNCATE ไม่รองรับการลบแบบเลือก ตัวอย่างเช่น หากคุณต้องการลบผู้ใช้คนหนึ่งเท่านั้น คุณจะใช้ DELETE ตามตัวอย่างด้านล่าง:

DELETE FROM users WHERE id = 1;

เนื่องจาก TRUNCATE ลบแถวทั้งหมด DELETE จึงเหมาะสมกว่าเมื่อคุณต้องการลบเฉพาะบันทึกบางรายการ

3. ผลกระทบของ TRUNCATE ต่อ AUTO_INCREMENT

การรีเซ็ต AUTO_INCREMENT

เมื่อคุณใช้คำสั่ง TRUNCATE ข้อมูลทั้งหมดในตารางจะถูกลบและค่า AUTO_INCREMENT จะถูกรีเซ็ตพร้อมกัน หมายความว่าถ้าเพิ่มข้อมูลใหม่ ID จะเริ่มนับใหม่จาก 1 ตัวอย่างเช่น หากคุณแทรกข้อมูลใหม่ลงในตาราง users จะเป็นดังนี้:

INSERT INTO users (name) VALUES ('Ken');
-- The id starts again from 1

การรีเซ็ตนี้อาจสะดวกในบางสถานการณ์ อย่างไรก็ตาม ควรระมัดระวังโดยเฉพาะเมื่อ ID ถูกใช้เป็น foreign key ในตารางอื่น อาจเกิดความไม่สอดคล้องของข้อมูลโดยไม่คาดคิด ดังนั้นควรพิจารณาผลกระทบอย่างรอบคอบก่อนใช้ TRUNCATE

4. ข้อควรพิจารณาที่สำคัญเมื่อใช้ TRUNCATE

ข้อมูลไม่สามารถกู้คืนได้

ความเสี่ยงที่ใหญ่ที่สุดของคำสั่ง TRUNCATE คือข้อมูล ไม่สามารถกู้คืนได้ หากข้อมูลสำคัญถูกลบโดยบังเอิญ จะไม่สามารถกู้คืนได้ ดังนั้นจึงขอแนะนำอย่างยิ่งให้ทำการสำรองข้อมูลของคุณก่อนดำเนินการคำสั่งนี้

ข้อจำกัดของ Foreign Key

คำสั่ง TRUNCATE ไม่สามารถใช้กับตารางที่เปิดใช้งานข้อจำกัด foreign key ได้ ในกรณีเช่นนี้ คุณต้องลบข้อจำกัด foreign key ก่อนหรือจัดการข้อมูลที่เกี่ยวข้องด้วยวิธีอื่น

สิทธิ์การดำเนินการ

เพื่อเรียกใช้คำสั่ง TRUNCATE คุณต้องมีสิทธิ์ลบตาราง (สิทธิ์ DROP) ผู้ใช้ที่ไม่มีสิทธิ์ที่จำเป็นจะไม่สามารถรันคำสั่งนี้ได้ ดังนั้นควรตรวจสอบสิทธิ์ที่เหมาะสมล่วงหน้า

5. เมื่อใดควรใช้ TRUNCATE กับ DELETE

เมื่อคุณควรใช้ TRUNCATE

TRUNCATE เหมาะกับกรณีที่ต้องการล้างข้อมูลทั้งหมดของตารางในครั้งเดียว โดยเฉพาะเมื่อต้องการลบข้อมูลอย่างรวดเร็วหรือเมื่อต้องการรีเซ็ตค่า AUTO_INCREMENT ตัวอย่างเช่น การรีเซ็ตข้อมูลทดสอบหลายครั้ง

เมื่อคุณควรใช้ DELETE

ในทางกลับกัน หากต้องการลบแถวแบบเลือกหรือให้ทริกเกอร์ทำงาน คุณควรใช้คำสั่ง DELETE การลบข้อมูลตามเงื่อนไขเฉพาะหรือการรักษาความสมบูรณ์ของฐานข้อมูลอย่างปลอดภัยนั้น DELETE จะเหมาะสมกว่า

6. แนวปฏิบัติที่ดีที่สุดสำหรับการใช้ TRUNCATE อย่างปลอดภัย

ความสำคัญของการสำรองข้อมูล

ก่อนรันคำสั่ง TRUNCATE จำเป็นต้องสร้าง การสำรองข้อมูล เนื่องจากการสูญเสียข้อมูลจากการลบโดยบังเอิญไม่สามารถย้อนกลับได้ จึงต้องระมัดระวังเป็นพิเศษโดยเฉพาะในสภาพแวดล้อมการผลิต

ตรวจสอบในสภาพแวดล้อมทดสอบ

ก่อนนำ TRUNCATE ไปใช้ในสภาพแวดล้อมการผลิต ควรทดสอบในสภาพแวดล้อมการพัฒนา หรือสเตจจิ้ง เพื่อยืนยันว่าพฤติกรรมเป็นไปตามที่คาดหวังและช่วยป้องกันปัญหาที่ไม่คาดคิด

การจัดการคอลัมน์ AUTO_INCREMENT

เนื่องจาก TRUNCATE รีเซ็ตค่า AUTO_INCREMENT หากการคงความสอดคล้องของ ID ที่เป็นเอกลักษณ์เป็นสิ่งสำคัญ คุณควรตรวจสอบการสำรองข้อมูลและความสัมพันธ์กับตารางอื่นก่อนดำเนินการนี้