خانه/ تغییر داده‌ها/ DELETE

DELETE: حذف ردیف‌های موجود

مبتدی ۱۲ دقیقه مطالعه

ساختار پایه

sql
DELETE FROM orders
WHERE status = N'لغو شده';

بیا این را روی چند سفارش امتحان کنیم:

امتحانش کن — DELETE با WHERE

⚠️ همان خطر UPDATE، این‌بار برای همیشه

DELETE بدون WHERE، دقیقاً مثل UPDATE بدون WHERE، روی همه‌ی ردیف‌های جدول اعمال می‌شود — با این تفاوت که این‌بار داده به‌طور کامل از بین می‌رود، نه فقط تغییر می‌کند. بیا این خطر را (باز هم، کاملاً امن در همین Playground موقت) ببینیم:

امتحانش کن — DELETE بدون WHERE (فقط برای دیدن خطر!)
هر سه سفارش، از جمله دو سفارش «تحویل شده» و «در حال ارسال» که هیچ ربطی به لغو نداشتند، برای همیشه پاک شدند. همان عادت درس قبل را این‌جا هم رعایت کن: پیش از DELETE واقعی، همان WHERE را با یک SELECT پیش‌نمایش بگیر.

حذف بر اساس زیرپرس‌وجو

می‌توان بر اساس نتیجه‌ی یک زیرپرس‌وجو هم حذف کرد — مثلاً حذف تمام ثبت‌نام‌های دانش‌آموزی که دیگر در سیستم نیست:

sql
DELETE FROM enrollments
WHERE student_id IN (
  SELECT id FROM students WHERE city IS NULL
);
یادت هست در درس زیرپرس‌وجوها دیدیم NOT IN با NULL خطرناک است؟ همان قانون این‌جا هم برقرار است — اگر از NOT IN برای حذف استفاده می‌کنی، حتماً مطمئن شو زیرپرس‌وجو هیچ NULL ای برنمی‌گرداند، وگرنه DELETEات ممکن است بی‌سروصدا هیچ ردیفی حذف نکند.

DELETE در برابر TRUNCATE — یادآوری مهم

در درس جدول‌ها (فصل ۱) این دو را مختصر دیدیم؛ حالا که دلیل واقعی‌اش را می‌دانی، دوباره کنار هم می‌گذاریمشان:

دستورمی‌توان فیلتر کرد؟سرعتشماره‌گذاری خودکار
DELETE FROM t WHERE ...بلهکندتر (ردیف‌به‌ردیف ثبت می‌شود)ادامه می‌دهد از همان‌جا که بود
TRUNCATE TABLE tخیر — همیشه همه‌ی ردیف‌هاخیلی سریع‌ترمعمولاً از نو صفر می‌شود

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

یادآوری: ON DELETE CASCADE

در درس کلید خارجی دیدیم اگر رابطه‌ای با ON DELETE CASCADE تعریف شده باشد، حذف یک ردیف والد، ردیف‌های فرزند وابسته را هم خودکار حذف می‌کند. این یعنی گاهی یک DELETE ساده، می‌تواند اثری بسیار بزرگ‌تر از آن‌چه در نگاه اول به‌نظر می‌رسد داشته باشد — دلیل دیگری برای همیشه پیش‌نمایش‌گرفتن پیش از حذف واقعی.

جمع‌بندی این درس

  • DELETE FROM table WHERE condition; فقط ردیف‌های منطبق را برای همیشه حذف می‌کند.
  • هرگز DELETE بدون WHERE اجرا نکن، مگر واقعاً بخواهی کل جدول خالی شود.
  • حذف بر اساس زیرپرس‌وجو ممکن است؛ با NOT IN و احتمال NULL مراقب باش.
  • TRUNCATE سریع‌تر است اما قابل‌فیلتر نیست؛ DELETE انعطاف‌پذیرتر اما کندتر است.

در آخرین درس این فصل، سراغ MERGE می‌رویم: یک دستور که INSERT، UPDATE و DELETE را در یک عملیات ترکیب می‌کند — و این‌که چرا SQLite معادلش را متفاوت پیاده می‌کند.