DELETE: حذف ردیفهای موجود
ساختار پایه
DELETE FROM orders WHERE status = N'لغو شده';
بیا این را روی چند سفارش امتحان کنیم:
⚠️ همان خطر UPDATE، اینبار برای همیشه
DELETE بدون WHERE، دقیقاً مثل UPDATE بدون WHERE، روی همهی ردیفهای جدول اعمال میشود — با این تفاوت که اینبار داده بهطور کامل از بین میرود، نه فقط تغییر میکند. بیا این خطر را (باز هم، کاملاً امن در همین Playground موقت) ببینیم:
DELETE واقعی، همان WHERE را با یک SELECT پیشنمایش بگیر.حذف بر اساس زیرپرسوجو
میتوان بر اساس نتیجهی یک زیرپرسوجو هم حذف کرد — مثلاً حذف تمام ثبتنامهای دانشآموزی که دیگر در سیستم نیست:
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 معادلش را متفاوت پیاده میکند.