تخطَّ إلى المحتوى

تعديل البيانات في SQL: INSERT و UPDATE و DELETE

الدرس 6 من 12 · SQL

حتى الآن كنت تقرأ البيانات فقط. لكن التطبيقات الحقيقية تكتب البيانات طوال الوقت: مستخدم جديد يسجل، وطالب تتغير درجته، ورسالة تُحذف. في هذا الدرس ستتعلم الأوامر الثلاثة التي تغيّر البيانات، ومعها أهم تحذير في كل كورس SQL: لا تنسَ WHERE أبداً!

سنكمل على جدول الطلاب نفسه، الذي فيه 6 طلاب حتى الآن.

INSERT INTO students (id, name, age, city, score)
VALUES (7, 'كريم', 14, 'المنصورة', 88);
  • بعد اسم الجدول، بين قوسين: الأعمدة التي ستملؤها.
  • بعد VALUES: القيم بنفس الترتيب تماماً.

كتابة أسماء الأعمدة ليست إجبارية دائماً، لكنها عادة ممتازة: تجعل الاستعلام واضحاً، ولا ينكسر إذا أُضيف عمود جديد للجدول لاحقاً.

إضافة عدة صفوف دفعة واحدة:

INSERT INTO students (id, name, age, city) VALUES
(8, 'هالة', 15, 'طنطا'),
(9, 'زياد', 13, 'القاهرة');
SELECT id, name, city, score FROM students WHERE id >= 7;

الناتج:

id name city score
7 كريم المنصورة 88
8 هالة طنطا NULL
9 زياد القاهرة NULL

لاحظ: لم نذكر score لهالة وزياد، فأخذا NULL. أي عمود لا تذكره يأخذ قيمته الافتراضية (DEFAULT) أو NULL.

سُجلت درجة ليلى أخيراً:

UPDATE students SET score = 80 WHERE id = 5;
SELECT name, score FROM students WHERE id = 5;

الناتج:

name score
ليلى 80
  • UPDATE ثم اسم الجدول.
  • SET: العمود والقيمة الجديدة. ولتعديل عدة أعمدة: SET score = 80, city = 'سوهاج'.
  • WHERE: أي صفوف ستُعدَّل.

ويمكن أن تعتمد القيمة الجديدة على القديمة. مثلاً، درجات إضافية لطلاب الإسكندرية:

UPDATE students SET score = score + 5 WHERE city = 'الإسكندرية';
SELECT name, score FROM students WHERE city = 'الإسكندرية';

الناتج:

name score
عمر 83
أحمد 76

عُدّل صفّان دفعة واحدة: كل صف يحقق الشرط.

DELETE FROM students WHERE id = 9;
SELECT COUNT(*) FROM students;

الناتج: 8

حُذف زياد، وبقي 8 طلاب. ويمكن حذف عدة صفوف بشرط واحد، مثل DELETE FROM students WHERE score IS NULL; التي ستحذف هالة لأنها بلا درجة.

أخطر خطأ في SQL: نسيان WHERE

Section titled “أخطر خطأ في SQL: نسيان WHERE”

انظر إلى هذين الأمرين ولا تنفذهما على بيانات مهمة:

UPDATE students SET score = 0;
DELETE FROM students;

بدون WHERE، الشرط ينطبق على كل الصفوف: الأول يجعل درجات كل الطلاب صفراً، والثاني يحذف كل الطلاب! ولن تسألك قاعدة البيانات «هل أنت متأكد؟».

تخيّل WHERE مثل العنوان على الطرد: إذا نسيته، لن يصل الطرد لبيت واحد، بل سيُرسل لكل بيوت المدينة!

المعاملات: كل شيء أو لا شيء

Section titled “المعاملات: كل شيء أو لا شيء”

في بعض العمليات، يجب أن تنجح عدة أوامر معاً أو تفشل معاً. أشهر مثال: تحويل مبلغ بين حسابين بنكيين، يخصم من حساب ويضيف لآخر. لو نُفذ الخصم ثم انقطعت الكهرباء قبل الإضافة، ضاع المال!

الحل: المعاملة (Transaction):

BEGIN;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
COMMIT;
  • BEGIN: ابدأ المعاملة.
  • COMMIT: احفظ كل التغييرات معاً.
  • إذا حدث خطأ قبل COMMIT، يمكن التراجع عن كل شيء بـ ROLLBACK، فتعود البيانات كما كانت.

على جدول الطلاب:

  1. أضف ثلاثة طلاب جدد بأمر INSERT واحد.
  2. غيّر مدينة أحد الطلاب ودرجته في أمر UPDATE واحد.
  3. أضف 3 درجات لكل طالب درجته أقل من 70.
  4. احذف طالباً واحداً، لكن اكتب SELECT بنفس الشرط أولاً وتأكد من النتيجة.
  • نسيان WHERE في UPDATE أو DELETE: يؤثر على الجدول كله.
  • عدد القيم لا يطابق عدد الأعمدة: خطأ مثل 3 values for 4 columns.
  • تكرار المفتاح الأساسي في INSERT: يرفضه النظام بخطأ القيد UNIQUE، كما رأيت في درس الجداول.

سؤال

ماذا يحدث عند تنفيذ DELETE FROM students; بدون WHERE؟

سؤال

ما الأمر الصحيح لزيادة درجة الطالب رقم 3 بمقدار 10؟

  • INSERT INTO table (أعمدة) VALUES (...) للإضافة، ويمكن إضافة عدة صفوف معاً.
  • UPDATE table SET col = قيمة WHERE ... للتعديل، والقيمة يمكن أن تعتمد على القديمة.
  • DELETE FROM table WHERE ... للحذف.
  • نسيان WHERE يؤثر على كل الصفوف، فجرّب الشرط بـ SELECT أولاً.
  • المعاملات BEGIN و COMMIT و ROLLBACK تضمن نجاح عدة أوامر معاً أو فشلها معاً.