دستور SQL TRUNCATE TABLE – حذف سریع دادهها با حفظ ساختار جدول
دستور TRUNCATE TABLE یک فرمان سریع و کارآمد برای خالی کردن کامل دادهها از یک جدول در SQL است، بدون آنکه ساختار جدول (ستونها، ایندکسها، محدودیتها) را حذف کند این دستور مانند ترکیبی از DROP و CREATE عمل میکند و برای حذف سریع دادهها از حجم بالا بسیار مناسب است .
نحو عمومی دستور
TRUNCATE TABLE نام_جدول;
فقط نام جدول لازم است.
امکان استفاده از
WITH (PARTITIONS(...))در SQL Server برای حذف بخشهایی از جدولهای پارتیشنبندیشده وجود دارد
تفاوت TRUNCATE vs DELETE
| ویژگی | DELETE | TRUNCATE |
|---|---|---|
| نوع فرمان | DML | DML یا DDL بسته به پیادهسازی |
| فیلتر WHERE | بله | خیر |
| ثبت در لاگ | هر ردیف بهصورت جداگانه | فقط صفحههای حافظه آزاد میشوند |
| لاکها | لاک ردیف به ردیف | لاک جدول/صفحه |
| بازگشتپذیری | در تراکنشها قابل ROLLBACK | در برخی پیادهسازیها بازگشت دارد (SQL Server، PostgreSQL) |
| بازنشانی Identity | خیر | بله — مقدار به مقدار اولیه بازمیگردد |
| اجرای تریگرها | بله | خیر — تریگرها اجرا نمیشوند |
| محدودیت foreign key | فرقی ندارد | جدول مرجع نباید foreign key داشته باشد |
TRUNCATE vs DROP
DROP TABLEجدول را بهطور کامل حذف میکند:دادهها، ساختار و تمام اجزایش را برمیدارد.
برای حذف سریع، اما بدون ارزش ساختار، مناسب است.
TRUNCATE TABLEتنها دادهها را حذف میکند و ساختار را حفظ مینماید
مزایای استفاده از TRUNCATE
بهرهوری بالا: حذف سریع دادهها با هزینه کم سیستم و لاگ .
سرعت زیاد: مناسب برای حجم بالا، بسیار سریعتر از
DELETE.پاکسازی حافظه: پیامدهای حذف دادهها صفحهای و بهینه.
بازنشانی Identity: شمارنده ستونهای identity به مقدار اولیه بازمیگردد.
عدم اجرا تریگر: مناسب برای مواقعی که اجرا تریگرها سبب مشکلات جانبی میشود.
محدودیتها و نکات مهم
نمیتوان از
WHEREاستفاده کرد.اگر جدول مرجع foreign key داشته باشد، استفاده ممنوع است
در برخی پایگاهها (مانند SQL Server)، استفاده داخل تراکنش ممکن است مجاز باشد اما باید توجه داشت .
برخی سیستمها (InterSystems IRIS) نیاز به دسترسی یا پرچم ویژه (
%NOTRIGGER) دارندساختار جدول دستنخورده میماند؛ اگر نیاز به حذف کامل دارید، از
DROP TABLEاستفاده کنید.
مثال در SQL Server
USE AdventureWorks2022;
SELECT COUNT(*) AS BeforeTruncateCount
FROM HumanResources.JobCandidate;
TRUNCATE TABLE HumanResources.JobCandidate;
SELECT COUNT(*) AS AfterTruncateCount
FROM HumanResources.JobCandidate;
این کد پیش و پس از اجرای TRUNCATE تعداد ردیفها را نشان داده و رسیدن به صفر را تأیید میکند.
با
WITH (PARTITIONS(...))میتوانید یک یا چند پارتیشن خاص را حذف کنید
جمعبندی
TRUNCATE TABLEیک فرمان سریع برای حذف تمام دادهها با حفظ ساختار جدول است.گزینه مناسبی برای شرایطی که فقط قصد پاکسازی دارید و نیاز به حفظ ایندکسها، محدودیتها و identity دارید.
در پروژهها و سناریوهای real-time — مانند بازسازی سریع داده در جداول staging یا دیتاوِرهاوس — بسیار کاربردی است.
دیدگاهتان را بنویسید