راهنمای جامع دستور DELETE در SQL Server: حذف بهینه دادهها
دستور DELETE در SQL Server برای حذف یک یا چند رکورد از یک جدول استفاده میشود. این دستور یک تغییر در دادهها (DML) است و به شما امکان میدهد تا دادههای مشخصی را بر اساس معیارهای خاص حذف کنید. حذف رکوردها در SQL Server با استفاده از دستور DELETE باید با دقت انجام شود، زیرا دادههای حذف شده معمولاً قابل بازیابی نیستند مگر اینکه بکاپ مناسبی وجود داشته باشد.
نحوه استفاده از دستور DELETE بسیار مهم است. اگر این دستور بدون قید WHERE استفاده شود، تمام رکوردهای جدول حذف خواهند شد. برای جلوگیری از حذف ناخواسته دادهها، همواره توصیه میشود ابتدا دستور SELECT را با همان قید WHERE اجرا کنید تا رکوردهایی که قرار است حذف شوند را مشاهده و تأیید کنید.
ساختار کلی دستور DELETE به شرح زیر است:
DELETE FROM Table_Name WHERE Condition;
در این ساختار:
* `DELETE FROM` کلمات کلیدی برای آغاز عملیات حذف هستند.
* `Table_Name` نام جدولی است که میخواهید رکوردها را از آن حذف کنید.
* `WHERE Condition` یک بند اختیاری است که ردیفهای خاصی را برای حذف مشخص میکند. اگر این بند حذف شود، تمام ردیفهای جدول حذف میشوند.
برای مثال، فرض کنید یک جدول با دادههای مشتریان دارید و میخواهید مشتری با شناسه `CustomerID` برابر با `1` را حذف کنید. این کار به سادگی با استفاده از دستور DELETE و یک بند WHERE انجام میشود:
DELETE FROM Customers
WHERE CustomerID = 1;
برای حذف تمام ردیفها از یک جدول (بدون هیچ قیدی)، از دستور زیر استفاده میشود:
DELETE FROM Customers;
این دستور تمام رکوردهای جدول `Customers` را حذف میکند.
میتوانید از یک زیرپرس و جو (subquery) در بند WHERE دستور DELETE برای حذف ردیفهایی که با نتایج یک پرس و جوی دیگر مطابقت دارند، استفاده کنید. به عنوان مثال، برای حذف مشتریانی که هیچ سفارشی ثبت نکردهاند:
DELETE FROM Customers
WHERE CustomerID NOT IN (SELECT CustomerID FROM Orders);
دستور DELETE همچنین میتواند با JOIN ترکیب شود تا رکوردهایی را از یک جدول بر اساس شرایط مربوط به یک یا چند جدول دیگر حذف کند. این روش برای حذف دادههای مرتبط و حفظ یکپارچگی پایگاه داده بسیار مفید است. فرض کنید میخواهید تمام سفارشات مربوط به مشتریانی که در شهر “New York” هستند را حذف کنید.
DELETE O
FROM Orders O
INNER JOIN Customers C ON O.CustomerID = C.CustomerID
WHERE C.City = 'New York';
در این مثال، `O` به عنوان نام مستعار برای جدول `Orders` و `C` برای جدول `Customers` استفاده شده است.
میتوانید با استفاده از بند TOP به دستور DELETE، تعداد مشخصی از ردیفها را حذف کنید. این کار برای حذف دسته ای دادهها یا مدیریت حجم دادهها مفید است. مثلاً برای حذف ۱۰ رکورد اول از جدول `Logs` که دارای خطای خاصی هستند:
DELETE TOP (10) FROM Logs
WHERE LogLevel = 'Error'
ORDER BY LogDate ASC;
توجه داشته باشید که استفاده از `ORDER BY` با `TOP` در دستور DELETE برای اطمینان از حذف ردیفهای صحیح ضروری است، زیرا بدون آن، ردیفهای حذف شده ممکن است غیرقابل پیشبینی باشند.
تفاوتهای کلیدی بین DELETE و TRUNCATE TABLE نیز حائز اهمیت است:
* **DELETE** یک دستور DML (Data Manipulation Language) است که ردیفها را یک به یک حذف میکند. این عملیات قابل برگشت (rollback) است و هر ردیف حذف شده در لاگ تراکنش ثبت میشود. همچنین میتوان از بند WHERE برای فیلتر کردن ردیفها استفاده کرد.
* **TRUNCATE TABLE** یک دستور DDL (Data Definition Language) است که تمام ردیفها را به سرعت از یک جدول حذف میکند و فضا را آزاد میکند. این عملیات بسیار سریعتر از DELETE است زیرا ردیفها را یکی یکی حذف نمیکند و هر ردیف در لاگ تراکنش ثبت نمیشود (فقط تخصیص صفحات لاگ میشود). TRUNCATE TABLE قابل برگشت نیست (در یک تراکنش صریح ممکن است قابل برگشت باشد، اما اغلب به عنوان غیرقابل برگشت در نظر گرفته میشود) و نمیتواند با بند WHERE استفاده شود. همچنین، TRUNCATE TABLE مقادیر IDENTITY (شناسههای خودکار) را به مقدار اولیه خود بازنشانی میکند، در حالی که DELETE این کار را انجام نمیدهد.
برای حذف تمام ردیفها از یک جدول با استفاده از TRUNCATE TABLE:
TRUNCATE TABLE Table_Name;
انتخاب بین DELETE و TRUNCATE TABLE به نیازهای شما بستگی دارد. اگر نیاز به حذف انتخابی ردیفها، قابلیت برگشت پذیری یا حفظ مقادیر IDENTITY دارید، از DELETE استفاده کنید. اگر نیاز به حذف سریع تمام ردیفها و بازنشانی IDENTITY دارید، TRUNCATE TABLE گزینه بهتری است.