مقدمة عن DELETE
أمر DELETE يُستخدم لحذف صفوف من جدول.
الحذف دائم ولا يمكن التراجع عنه (إلا باستخدام المعاملات أو النسخ الاحتياطية).
تحذير خطير!
DELETE بدون WHERE يحذف جميع البيانات في الجدول! هذا خطأ شائع ومدمر. تأكد دائماً من وجود WHERE.
الصيغة الأساسية
DELETE FROM table_name
WHERE condition;
أمثلة عملية
1. حذف صف واحد
-- حذف موظف بمعرّف محدد
DELETE FROM employees
WHERE id = 5;
-- التحقق
SELECT * FROM employees;
2. حذف بشرط نصي
-- حذف موظف باسمه
DELETE FROM employees
WHERE name = 'علي';
-- تأكد من كتابة الاسم بشكل صحيح!
3. حذف عدة صفوف
-- حذف جميع موظفي قسم معين
DELETE FROM employees
WHERE department_id = 4;
-- حذف كل من راتبه أقل من 4000
DELETE FROM employees
WHERE salary < 4000;
4. حذف بشروط متعددة
-- حذف موظفي التقنية الذين راتبهم أقل من 5000
DELETE FROM employees
WHERE department_id = 2
AND salary < 5000;
-- حذف من أقسام متعددة
DELETE FROM employees
WHERE department_id IN (3, 4);
5. حذف باستخدام LIKE
-- حذف كل الأسماء التي تبدأ بـ "م"
DELETE FROM employees
WHERE name LIKE 'م%';
6. حذف القيم الفارغة
-- حذف الصفوف التي ليس لها قسم
DELETE FROM employees
WHERE department_id IS NULL;
حذف جميع البيانات
DELETE بدون WHERE
-- خطير! يحذف كل البيانات
DELETE FROM employees;
-- الجدول يبقى موجوداً لكنه فارغ
-- auto_increment لا يُعاد تعيينه
TRUNCATE - أسرع للحذف الكامل
-- حذف جميع البيانات بسرعة
TRUNCATE TABLE employees;
-- الفرق عن DELETE:
-- 1. أسرع بكثير للجداول الكبيرة
-- 2. يُعيد تعيين auto_increment
-- 3. لا يمكن التراجع عنه (حتى مع Transaction)
-- 4. لا يُفعّل triggers
DROP TABLE - حذف الجدول نفسه
-- حذف الجدول بالكامل (البيانات والهيكل)
DROP TABLE employees;
-- الجدول لم يعد موجوداً!
-- يجب إنشاؤه من جديد لاستخدامه
مقارنة
DELETE: يحذف البيانات، الجدول يبقى
TRUNCATE: يحذف كل البيانات بسرعة، الجدول يبقى
DROP: يحذف الجدول نفسه بالكامل
أفضل الممارسات
1. اختبر بـ SELECT أولاً
-- قبل الحذف، شاهد ما سيُحذف:
SELECT * FROM employees
WHERE department_id = 4;
-- إذا كانت النتيجة صحيحة:
DELETE FROM employees
WHERE department_id = 4;
2. استخدم COUNT للتحقق
-- كم صف سيُحذف؟
SELECT COUNT(*) FROM employees
WHERE salary < 4000;
-- إذا الرقم منطقي، نفذ الحذف
3. استخدم المعاملات
BEGIN TRANSACTION;
DELETE FROM employees
WHERE department_id = 4;
-- راجع النتيجة
SELECT * FROM employees;
-- إذا صحيح:
COMMIT;
-- إذا خطأ:
ROLLBACK;
4. استخدم LIMIT للأمان
-- MySQL: حذف بحد أقصى
DELETE FROM employees
WHERE salary < 4000
LIMIT 5; -- يحذف 5 صفوف كحد أقصى
DELETE مع Subquery
-- حذف موظفي قسم معين بالاسم
DELETE FROM employees
WHERE department_id = (
SELECT id FROM departments
WHERE name = 'الموارد البشرية'
);
-- حذف الطلبات للمنتجات غير المتوفرة
DELETE FROM orders
WHERE product_id IN (
SELECT id FROM products
WHERE stock = 0
);
القيود (Constraints) والحذف
-- إذا كان هناك Foreign Key، قد يفشل الحذف:
DELETE FROM departments WHERE id = 2;
-- خطأ! هناك موظفون مرتبطون بهذا القسم
-- الحلول:
-- 1. حذف الموظفين أولاً
DELETE FROM employees WHERE department_id = 2;
DELETE FROM departments WHERE id = 2;
-- 2. أو استخدام ON DELETE CASCADE عند إنشاء الجدول
-- (يحذف الصفوف المرتبطة تلقائياً)
تمارين للتطبيق
- احذف آخر موظف تم إضافته
- احذف جميع الطلبات من العميل "خالد"
- احذف المنتجات التي مخزونها = 0
- استخدم SELECT أولاً ثم DELETE للتأكد
الخلاصة
DELETE FROMلحذف صفوف- دائماً استخدم
WHERE - اختبر بـ
SELECTقبل الحذف TRUNCATEأسرع لحذف كل البياناتDROP TABLEيحذف الجدول نفسه- استخدم المعاملات للأمان