خانه/ وبلاگ/ تفاوت DELETE، TRUNCATE و DROP در SQL Server
آموزش SQL

تفاوت DELETE، TRUNCATE و DROP در SQL Server

آموزش SQL ۵ آبان ۱۴۰۵ 8 دقیقه مطالعه

سه دستور برای «پاک کردن» وجود دارد و سه کار متفاوت می‌کنند: DELETE ردیف‌ها را حذف می‌کند، TRUNCATE همه‌ی ردیف‌ها را به‌سرعت خالی می‌کند و DROP خودِ جدول را از بین می‌برد. انتخاب اشتباه می‌تواند داده‌ی مهم را از بین ببرد.

جدول مقایسه

ویژگیDELETETRUNCATE TABLEDROP TABLE
چه چیزی را پاک می‌کندردیف‌های انتخابی یا همههمه‌ی ردیف‌هاکل جدول و ساختارش
شرط (WHERE)داردنداردندارد
نوع دستورDMLDDLDDL
لاگهر ردیف جداگانه لاگ می‌شودفقط آزادسازی صفحه‌ها لاگ می‌شودثبت تغییر ساختار
سرعتکندتربسیار سریعسریع
شمارنده‌ی IDENTITYادامه می‌یابدریست می‌شود—
Trigger (DELETE)اجرا می‌شوداجرا نمی‌شوداجرا نمی‌شود
جدول با FK ارجاع‌شدهممکن (با رعایت قید)ممکن نیستممکن نیست (ابتدا FK حذف شود)
Rollback در تراکنشبلهبلهبله

DELETE: حذف انتخابی

sql
-- حذف ثبت‌نام‌های یک دانشجو
DELETE FROM Enrollment WHERE StudentId = 5;

-- حذف همه‌ی ردیف‌ها (بدون WHERE) — با احتیاط!
DELETE FROM Enrollment;
قبل از DELETE همان شرط را با SELECT امتحان کن و دستور را داخل تراکنش بزن تا در صورت اشتباه بتوانی ROLLBACK کنی.
sql
BEGIN TRANSACTION;
  DELETE FROM Enrollment WHERE Grade < 10;
  SELECT @@ROWCOUNT AS DeletedRows;   -- تعداد حذف‌شده را ببین
-- درست بود: COMMIT؛ اشتباه بود: ROLLBACK
ROLLBACK;

TRUNCATE: خالی کردن سریع

sql
TRUNCATE TABLE LogEntries;

ساختار جدول، ایندکس‌ها و قیدها می‌مانند ولی همه‌ی ردیف‌ها پاک و شمارنده‌ی IDENTITY دوباره از مقدار اولیه شروع می‌شود. برای جدول‌های لاگ یا دیتای موقت مناسب است. اگر جدول توسط یک FOREIGN KEY ارجاع شده باشد، خطا می‌گیری:

text
Msg 4712: Cannot truncate table 'dbo.Student' because it is
being referenced by a FOREIGN KEY constraint.

DROP: حذف خودِ جدول

sql
DROP TABLE IF EXISTS TempReport;   -- بدون خطا اگر وجود نداشته باشد

جدول به همراه داده‌ها، ایندکس‌ها، Triggerها و مجوزهایش حذف می‌شود. در SQL Server از نسخه‌ی ۲۰۱۶ به بعد عبارت IF EXISTS در دسترس است.

کدام را انتخاب کنم؟

می‌خواهم...دستور
چند ردیف مشخص را پاک کنمDELETE ... WHERE
همه‌ی ردیف‌ها پاک شود ولی ساختار بماند، سریعTRUNCATE TABLE
شمارنده‌ی IDENTITY ریست شودTRUNCATE TABLE (یا DBCC CHECKIDENT)
Trigger حذف اجرا شودDELETE
جدول دیگر لازم نیستDROP TABLE

اگر هنگام حذف با خطای کلید خارجی روبه‌رو شدی، مقاله‌ی رفع خطای FOREIGN KEY را ببین. درس DELETE هم تمرین‌های عملی دارد.

سوالات متداول درباره‌ی این موضوع

آیا TRUNCATE را می‌توان Rollback کرد؟

بله، در SQL Server اگر TRUNCATE داخل یک تراکنش باز اجرا شود، قابل Rollback است (برخلاف برخی DBMSها). اما بعد از Commit، برگشتی ندارد.

چرا TRUNCATE روی جدولی با Foreign Key خطا می‌دهد؟

SQL Server اجازه نمی‌دهد جدولی که توسط کلید خارجی جدول دیگری ارجاع شده TRUNCATE شود، حتی اگر جدول فرزند خالی باشد. باید ابتدا قید را حذف کنی یا از DELETE استفاده کنی.

کدام سریع‌تر است؟

TRUNCATE معمولاً بسیار سریع‌تر از DELETE بدون شرط است چون فقط تخصیص صفحه‌ها را آزاد می‌کند و هر ردیف را جداگانه لاگ نمی‌کند.

مصطفی موسویسازنده و نویسنده‌ی SQLFarsi. اگر اشتباهی در مقاله دیدی یا پیشنهادی داری، از طریق mousavi.dev خبر بده.

می‌خوای SQL را از پایه و با تمرین یاد بگیری؟

دوره‌ی رایگان SQLFarsi را با Playground و پروژه‌های واقعی دنبال کن.

شروع یادگیری