TRUNCATE TABLE ใช้ทำอะไร?
ลบ ทุกแถว ในตารางอย่างรวดเร็ว ไม่มี WHERE clause คล้าย DELETE แต่ไม่ logging ต่อแถว (Minimal logging) เร็วกว่าและใช้ transaction log น้อยกว่า
รูปแบบคำสั่ง
TRUNCATE TABLE [database_name.][schema_name.]table_name
[WITH (PARTITIONS (partition_number | range))];
พารามิเตอร์
database_name,schema_name: ระบุได้ (optional)WITH (PARTITIONS ...): ลบเฉพาะ partition ที่ระบุ (ตาราง partitioned เท่านั้น)
ข้อสังเกตสำคัญ
- Identity counter จะ reset เริ่มนับใหม่จาก seed
- ไม่สามารถ TRUNCATE ตารางที่ถูก FK อ้างอิงได้ (ต้อง drop FK ก่อน)
- ต้องมีสิทธิ์
ALTER TABLEบนตาราง - ไม่ยิง AFTER DELETE trigger
- ไม่สามารถระบุ WHERE ได้
ตัวอย่าง
ลบทั้งตาราง
TRUNCATE TABLE nhanvien;
เทียบเท่า DELETE FROM nhanvien; แต่เร็วกว่าและไม่ rollback ได้ (นอกเหนือจากอยู่ใน explicit transaction)
ระบุฐานข้อมูล
TRUNCATE TABLE totn.dbo.danhba;
ลบ Partition เฉพาะ
TRUNCATE TABLE nhanvien
WITH (PARTITIONS (1 TO 5, 7));
ลบ partition 1-5 และ 7 (ตารางต้องเป็น partitioned table)
Rollback ได้ไหม?
ได้ หากอยู่ใน Explicit Transaction:
BEGIN TRAN;
TRUNCATE TABLE dbo.bang_test;
ROLLBACK;
-- ข้อมูลยังคงอยู่
สรุป: ใช้ TRUNCATE เมื่อต้องการล้างตารางทั้งหมด เร็วกว่า DELETE มาก แต่มีข้อจำกัด (FK, Trigger, Identity reset)