يُستخدم أمر DELETE في SQL لحذف صف أو أكثر من جدول. وهو من أوامر معالجة البيانات (DML) التي تؤثر في محتوى الجدول لا في بنيته. والقاعدة الذهبية عند استخدام DELETE هي الانتباه الشديد لجملة WHERE، فنسيانها يحذف كل صفوف الجدول دفعةً واحدة.
الحذف بشرط
لحذف صفوف محددة نضيف جملة WHERE تحدد أي الصفوف ستُحذف:
DELETE FROM users
WHERE id = 10;
هذا الأمر يحذف المستخدم صاحب المعرّف 10 فقط. ويمكن استخدام شروط أعقد لحذف مجموعة:
DELETE FROM orders
WHERE status = 'ملغي' AND created_at < '2024-01-01';
تحذير: الحذف بلا شرط
إذا نُفِّذ DELETE دون WHERE، تُحذف جميع صفوف الجدول دون استثناء، مع بقاء بنية الجدول كما هي.
-- خطير: يحذف كل الصفوف
DELETE FROM users;
لذلك يُنصح قبل تنفيذ أي DELETE على بيئة حقيقية بكتابة الشرط نفسه في استعلام SELECT أولاً لمعاينة الصفوف التي ستتأثر، ثم استبدال SELECT بـ DELETE بعد التأكد.
الفرق بين DELETE و TRUNCATE و DROP
هذه الأوامر الثلاثة يخلط بينها كثيرون: DELETE يحذف صفوفاً محددة (أو الكل) ويمكن استخدامه مع شرط ويمكن التراجع عنه ضمن معاملة. وTRUNCATE يحذف كل الصفوف بسرعة دون شرط ولا يمكن التراجع عنه عادةً. وDROP يحذف الجدول كاملاً ببنيته وبياناته.
أخطاء شائعة
- نسيان جملة WHERE فيُمحى الجدول كله دون قصد — أخطر خطأ في DELETE.
- تنفيذ الحذف على بيئة إنتاج دون نسخة احتياطية أو معاينة مسبقة.
- محاولة حذف صف مرتبط بمفتاح أجنبي في جدول آخر دون مراعاة قيود سلامة المرجعية.
تمرين محلول
المطلوب: احذف جميع المنتجات غير المتاحة (حالتها “غير متاح”) والتي لم تُبَع منذ بداية 2023.
-- خطوة المعاينة أولاً
SELECT * FROM products
WHERE availability = 'غير متاح' AND last_sold < '2023-01-01';
-- بعد التأكد، نفّذ الحذف
DELETE FROM products
WHERE availability = 'غير متاح' AND last_sold < '2023-01-01';
عاينّا الصفوف بـ SELECT بالشرط نفسه أولاً، وبعد التأكد من صحتها استبدلناه بـ DELETE — وهي عادة تحمي من الحذف الخاطئ.
الخلاصة
أمر DELETE يحذف الصفوف من الجدول، وقوّته تكمن في جملة WHERE التي تحدد ما يُحذف بدقة. وإتقان الفرق بينه وبين TRUNCATE وDROP، واعتياد معاينة الصفوف قبل الحذف، يحميك من أخطاء قد تكون كارثية على بياناتك.
