تفاوت DELETE، TRUNCATE و DROP در SQL Server
سه دستور برای «پاک کردن» وجود دارد و سه کار متفاوت میکنند: DELETE ردیفها را حذف میکند، TRUNCATE همهی ردیفها را بهسرعت خالی میکند و DROP خودِ جدول را از بین میبرد. انتخاب اشتباه میتواند دادهی مهم را از بین ببرد.
جدول مقایسه
| ویژگی | DELETE | TRUNCATE TABLE | DROP TABLE |
|---|---|---|---|
| چه چیزی را پاک میکند | ردیفهای انتخابی یا همه | همهی ردیفها | کل جدول و ساختارش |
| شرط (WHERE) | دارد | ندارد | ندارد |
| نوع دستور | DML | DDL | DDL |
| لاگ | هر ردیف جداگانه لاگ میشود | فقط آزادسازی صفحهها لاگ میشود | ثبت تغییر ساختار |
| سرعت | کندتر | بسیار سریع | سریع |
| شمارندهی IDENTITY | ادامه مییابد | ریست میشود | — |
| Trigger (DELETE) | اجرا میشود | اجرا نمیشود | اجرا نمیشود |
| جدول با FK ارجاعشده | ممکن (با رعایت قید) | ممکن نیست | ممکن نیست (ابتدا FK حذف شود) |
| Rollback در تراکنش | بله | بله | بله |
DELETE: حذف انتخابی
-- حذف ثبتنامهای یک دانشجو DELETE FROM Enrollment WHERE StudentId = 5; -- حذف همهی ردیفها (بدون WHERE) — با احتیاط! DELETE FROM Enrollment;
DELETE همان شرط را با SELECT امتحان کن و دستور را داخل تراکنش بزن تا در صورت اشتباه بتوانی ROLLBACK کنی.BEGIN TRANSACTION; DELETE FROM Enrollment WHERE Grade < 10; SELECT @@ROWCOUNT AS DeletedRows; -- تعداد حذفشده را ببین -- درست بود: COMMIT؛ اشتباه بود: ROLLBACK ROLLBACK;
TRUNCATE: خالی کردن سریع
TRUNCATE TABLE LogEntries;
ساختار جدول، ایندکسها و قیدها میمانند ولی همهی ردیفها پاک و شمارندهی IDENTITY دوباره از مقدار اولیه شروع میشود. برای جدولهای لاگ یا دیتای موقت مناسب است. اگر جدول توسط یک FOREIGN KEY ارجاع شده باشد، خطا میگیری:
Msg 4712: Cannot truncate table 'dbo.Student' because it is being referenced by a FOREIGN KEY constraint.
DROP: حذف خودِ جدول
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 بدون شرط است چون فقط تخصیص صفحهها را آزاد میکند و هر ردیف را جداگانه لاگ نمیکند.
میخوای SQL را از پایه و با تمرین یاد بگیری؟
دورهی رایگان SQLFarsi را با Playground و پروژههای واقعی دنبال کن.
شروع یادگیری