تعديل البيانات في SQL: INSERT و UPDATE و DELETE
حتى الآن كنت تقرأ البيانات فقط. لكن التطبيقات الحقيقية تكتب البيانات طوال الوقت: مستخدم جديد يسجل، وطالب تتغير درجته، ورسالة تُحذف. في هذا الدرس ستتعلم الأوامر الثلاثة التي تغيّر البيانات، ومعها أهم تحذير في كل كورس SQL: لا تنسَ WHERE أبداً!
سنكمل على جدول الطلاب نفسه، الذي فيه 6 طلاب حتى الآن.
الإضافة: INSERT INTO
Section titled “الإضافة: INSERT INTO”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
Section titled “التعديل: UPDATE”سُجلت درجة ليلى أخيراً:
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
Section titled “الحذف: DELETE”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، فتعود البيانات كما كانت.
جرّب بنفسك
Section titled “جرّب بنفسك”على جدول الطلاب:
- أضف ثلاثة طلاب جدد بأمر
INSERTواحد. - غيّر مدينة أحد الطلاب ودرجته في أمر
UPDATEواحد. - أضف 3 درجات لكل طالب درجته أقل من 70.
- احذف طالباً واحداً، لكن اكتب
SELECTبنفس الشرط أولاً وتأكد من النتيجة.
أخطاء شائعة
Section titled “أخطاء شائعة”- نسيان WHERE في UPDATE أو DELETE: يؤثر على الجدول كله.
- عدد القيم لا يطابق عدد الأعمدة: خطأ مثل
3 values for 4 columns. - تكرار المفتاح الأساسي في INSERT: يرفضه النظام بخطأ القيد
UNIQUE، كما رأيت في درس الجداول.
اختبر نفسك
Section titled “اختبر نفسك”سؤال
ماذا يحدث عند تنفيذ DELETE FROM students; بدون WHERE؟
بدون WHERE يُحذف كل صف في الجدول، لكن الجدول نفسه يبقى فارغاً. حذف الجدول نفسه يكون بـ DROP TABLE.
سؤال
ما الأمر الصحيح لزيادة درجة الطالب رقم 3 بمقدار 10؟
SET score = score + 10 تأخذ القيمة الحالية وتضيف إليها، و WHERE تحدد الطالب.
الخلاصة
Section titled “الخلاصة”INSERT INTO table (أعمدة) VALUES (...)للإضافة، ويمكن إضافة عدة صفوف معاً.UPDATE table SET col = قيمة WHERE ...للتعديل، والقيمة يمكن أن تعتمد على القديمة.DELETE FROM table WHERE ...للحذف.- نسيان
WHEREيؤثر على كل الصفوف، فجرّب الشرط بـSELECTأولاً. - المعاملات
BEGINوCOMMITوROLLBACKتضمن نجاح عدة أوامر معاً أو فشلها معاً.