MariaDB / الأساسي: الأسس العلاقية / الدرس 6
الإضافة والتحديث والحذف بحدود واضحة
غيّر مخزوناً تدريبياً بصورة متوقعة، وميز معالجة التكرار وتحقق من الأثر التجاري قبل الحفظ.
في هذه الصفحة
أهداف الدرس
- كتابة INSERT وUPDATE وDELETE محددة النطاق.
- تمييز الإدراج مع التحديث عن الاستبدال وتكرار الطلب الآمن.
حدد التغيير المقصود أولاً
للتغيير شرط سابق وصفوف مستهدفة وشرط لاحق. عند حجز المخزون اشترط كفاية الوحدات وحدد الصنف بدقة وأثبت بقاء الرصيد غير سالب. يفيد SELECT التمهيدي في المراجعة لكنه لا يحجز الصف ضد الكتابات المتزامنة. ضع الشرط داخل UPDATE أو استخدم قفلاً معاملاتياً. سمِّ أعمدة INSERT دائماً حتى لا تعيد تغييرات المخطط تفسير القيم الموضعية.
اجعل شرط العمل ذرياً
افترض عينة InnoDB معزولة فيها الصنف 4 بكمية 9. يحجز UPDATE الشرطي ثلاث وحدات فقط إذا بقي مخزون كافٍ. يجب أن تعيد ROW_COUNT() مباشرة واحداً، ثم يعرض SELECT ست وحدات وفق الافتراض. تعني نتيجة صفر ضرورة التمييز بين غياب الصنف وعدم كفاية المخزون. لا تكتب رصيداً حسبه التطبيق من قراءة قديمة غير مقفلة.
START TRANSACTION;
UPDATE inventory SET quantity = quantity - 3
WHERE item_id = 4 AND quantity >= 3;
SELECT ROW_COUNT() AS changed;
SELECT quantity FROM inventory WHERE item_id = 4;
ROLLBACK;
Expected with quantity initially 9: changed = 1; quantity = 6; rollback restores 9.
يجعل ROLLBACK النمط بروفة لبيانات معاملاتية؛ ولا ندعي تنفيذه.
معالجة التكرار تغير المعنى
قد تحدث INSERT ... ON DUPLICATE KEY UPDATE صفاً موجوداً عند تعارض مفتاح فريد أو أساسي. اعرف أي مفتاح قد يسبب المسار؛ تعدد القيود الفريدة المتنافسة يجعل الافتراض خطراً. تعمل REPLACE بالحذف ثم الإدراج عند التعارض، وقد تؤثر في الانتشار والقيم الافتراضية والمحفزات خلاف UPDATE. قد تخفض INSERT IGNORE بعض الأخطاء إلى تحذيرات. لا تمنح هذه الصيغ وحدها الطلب المعاد عبر الشبكة عقد عدم تكرار الأثر.
حدث صفاً مرجعياً مستقراً
لهذا الجدول التجريبي هوية فريدة واحدة هي رمز المحطة. تغير الإضافة الثانية اسم العرض عبر مسار المفتاح المكرر. الصف النهائي المتوقع R1 مع Riverside Depot. تشير VALUES(name) في صياغة MariaDB هذه إلى القيمة المرشحة للإدراج؛ لا تنقل نصائح MySQL حول بدائل الأسماء الخاصة بإصداراته دون تحقق. وفي العدادات حدد هل تضيف إعادة المحاولة مرة أخرى أم تعرف بمعرف طلب مستقل.
CREATE TABLE stations (code VARCHAR(8) PRIMARY KEY, name VARCHAR(80))
ENGINE=InnoDB;
INSERT INTO stations (code, name) VALUES ('R1', 'River Depot');
INSERT INTO stations (code, name) VALUES ('R1', 'Riverside Depot')
ON DUPLICATE KEY UPDATE name = VALUES(name);
SELECT code, name FROM stations ORDER BY code;
code | name
R1 | Riverside Depot
يتلقى الصف الحالي اسماً جديداً؛ ولا يحدث استبدال بالحذف ثم الإدراج.
يشمل التحقق أكثر من عدد الصفوف المتأثرة
تحذف DELETE الصفوف المطابقة، أما TRUNCATE فتعريف بيانات يختلف في القفل والمفاتيح الخارجية والحفظ الضمني، وليس اختصاراً معاملاتياً للحذف. راجع نطاق WHERE بدقة واحفظ أدلة التعافي المناسبة. قد يعتمد عدد الصفوف المتأثرة على تغير القيم وخيارات الموصل، خصوصاً في الإدراج مع التحديث. تحقق من الحالة النهائية والصفوف المرتبطة، لا رسالة العميل وحدها، وافحص التحذيرات فوراً عند السماح بالتحويل.
الأخطاء الشائعة وإصلاحها
يتغير كل صف في المخزون
- لماذا يحدث؟
- أُهمل WHERE المطلوب أو أُضعف.
- كيف تصلحه؟
- توقف قبل الحفظ إن أمكن واستخدم مسار التعافي المراجع.
- كيف تتجنب تكراره؟
- راجع المفاتيح المستهدفة والعدد المتوقع داخل معاملة تدريب.
يتجاوز الحجز المخزون دون انتباه
- لماذا يحدث؟
- حسب التطبيق الكمية الجديدة من قراءة قديمة.
- كيف تصلحه؟
- استخدم تحديثاً حسابياً شرطياً وعالج نتيجة الصفر.
- كيف تتجنب تكراره؟
- أبقِ شرط المخزون داخل الكتابة الذرية.
تختفي صفوف مرتبطة بعد REPLACE
- لماذا يحدث؟
- حذف الاستبدال الأصل السابق ونفذ عواقب الحذف.
- كيف تصلحه؟
- استخدم UPDATE صريحاً أو إدراجاً مع تحديث مصمماً بعناية عند وجوب بقاء الهوية.
- كيف تتجنب تكراره؟
- راجع المحفزات وإجراءات المرجعية قبل اختيار الاستبدال.
اختبر فهمك
1. في المخزون وحدتان ويحتاج الطلب ثلاثاً. ماذا يفعل الحجز الشرطي؟
اعرض الحل المشروح
يفشل الشرط quantity >= 3، فيبقى الرصيد 2 ولا ينجح الحجز. أعد نتيجة عدم كفاية المخزون بعد تمييز الصنف الغائب إذا احتاجت الواجهة ذلك. لا تعد المحاولة بإزالة الشرط. قد ينجح طلب لاحق لوحدة واحدة بالنمط الذري نفسه.
2. قد يعاد طلب دفع بعد ضياع الرد. لماذا لا يكفي جمع المبلغ بإدراج مع تحديث؟
اعرض الحل المشروح
يمكن للإرسالين زيادة الرصيد مع أن الحدث التجاري واحد. احفظ معرف طلب فريداً ونتيجته في معاملة أثر الدفع نفسها، وأعد النتيجة المسجلة عند التكرار. يعالج ذلك هوية الحدث بدلاً من مجرد تحديد تحديث صف عند تكرار مفتاح الحساب.
أهم ما تعلمته
- ضع الثوابت داخل الكتابة وتحقق من أثرها النهائي.
- الإدراج مع التحديث والاستبدال وعدم تكرار الأثر تحل مشكلات مختلفة.