الدرس 8

تحديث البيانات UPDATE

الوحدة الثالثة: التعديل على البيانات مدة القراءة: 15 دقيقة

مقدمة عن UPDATE

أمر UPDATE يُستخدم لتعديل البيانات الموجودة في جدول. يمكنك تحديث صف واحد أو عدة صفوف أو جميع الصفوف.

تحذير مهم!

UPDATE بدون WHERE يُحدّث جميع الصفوف في الجدول! تأكد دائماً من وجود شرط WHERE المناسب.

الصيغة الأساسية

UPDATE table_name
SET column1 = value1, column2 = value2
WHERE condition;

أمثلة عملية

1. تحديث عمود واحد

-- تحديث راتب موظف محدد
UPDATE employees
SET salary = 5500
WHERE id = 1;

-- التحقق من التحديث
SELECT * FROM employees WHERE id = 1;

2. تحديث عدة أعمدة

-- تحديث الراتب والقسم معاً
UPDATE employees
SET salary = 6000,
    department_id = 3
WHERE name = 'سارة';

SELECT * FROM employees WHERE name = 'سارة';

3. تحديث باستخدام العمليات الحسابية

-- زيادة راتب بنسبة 10%
UPDATE employees
SET salary = salary * 1.10
WHERE id = 1;

-- إضافة مبلغ ثابت
UPDATE employees
SET salary = salary + 500
WHERE department_id = 2;

-- خصم من الراتب
UPDATE employees
SET salary = salary - 200
WHERE id = 5;

4. تحديث عدة صفوف

-- زيادة رواتب جميع موظفي التقنية 15%
UPDATE employees
SET salary = salary * 1.15
WHERE department_id = 2;

-- تحديث كل من راتبه أقل من 5000
UPDATE employees
SET salary = 5000
WHERE salary < 5000;

5. تحديث مع شروط متعددة

-- زيادة لمن هم في التقنية وراتبهم أقل من 6000
UPDATE employees
SET salary = salary * 1.10
WHERE department_id = 2
  AND salary < 6000;

-- تحديث لأقسام محددة
UPDATE employees
SET salary = salary * 1.05
WHERE department_id IN (1, 2);

6. تحديث إلى NULL

-- إزالة قيمة القسم
UPDATE employees
SET department_id = NULL
WHERE id = 5;

-- ملاحظة: هذا يختلف عن DELETE
-- الصف موجود لكن قيمة العمود فارغة

7. تحديث جميع الصفوف (بحذر!)

-- زيادة سنوية لجميع الموظفين 5%
UPDATE employees
SET salary = salary * 1.05;

-- بدون WHERE = تحديث الكل!

أفضل الممارسات

1. اختبر بـ SELECT أولاً

-- قبل التحديث، تأكد من الصفوف المتأثرة:
SELECT * FROM employees
WHERE department_id = 2 AND salary < 6000;

-- إذا كانت النتيجة صحيحة، نفذ UPDATE:
UPDATE employees
SET salary = salary * 1.10
WHERE department_id = 2 AND salary < 6000;

2. استخدم المعاملات (Transactions)

-- في قواعد البيانات الحقيقية:
BEGIN TRANSACTION;

UPDATE employees
SET salary = salary * 1.10
WHERE department_id = 2;

-- إذا كل شيء صحيح:
COMMIT;

-- إذا حدث خطأ:
ROLLBACK;

3. استخدم LIMIT للأمان (بعض قواعد البيانات)

-- MySQL:
UPDATE employees
SET salary = 6000
WHERE department_id = 2
LIMIT 1;  -- يُحدّث صف واحد فقط

UPDATE مع Subquery

-- تحديث بناءً على قيمة من جدول آخر
UPDATE employees
SET department_id = (
    SELECT id FROM departments
    WHERE name = 'التقنية'
)
WHERE name = 'أحمد';

-- تحديث الرواتب لتساوي متوسط القسم
UPDATE employees e
SET salary = (
    SELECT AVG(salary)
    FROM employees
    WHERE department_id = e.department_id
)
WHERE salary < 4500;

أخطاء شائعة

-- خطأ فادح: نسيان WHERE
UPDATE employees SET salary = 0;
-- الآن جميع الرواتب = 0 !

-- خطأ: شرط WHERE خاطئ
UPDATE employees SET salary = 5000
WHERE name = 'احمد';  -- بدون همزة!
-- لن يتم تحديث أي شيء

-- خطأ: قسمة على صفر
UPDATE products
SET price = total / quantity
WHERE quantity = 0;  -- خطأ!

تمارين للتطبيق

  1. زِد راتب "أحمد" بمقدار 500
  2. حدّث قسم "علي" إلى قسم الإدارة (id = 3)
  3. زِد رواتب جميع من في قسم المبيعات 10%
  4. غيّر سعر المنتج "لابتوب" إلى 3800

الخلاصة

  • UPDATE ... SET لتعديل البيانات
  • دائماً استخدم WHERE لتحديد الصفوف
  • اختبر بـ SELECT قبل UPDATE
  • يمكن استخدام العمليات الحسابية
  • استخدم المعاملات في البيئات الحقيقية