محتويات الدورة

PostgreSQL / الأساسي: الأسس العلاقية / الدرس 6

الكتابة وRETURNING ومعالجة التعارض

اجعل كتابة المخزون تصرح بشروطها وتعيد أثرها، وافصل تحديث المفتاح المتعارض عن منع تكرار أثر الحدث التجاري.

وقت القراءة التقريبي: 4 دقيقةتاريخ مراجعة المحتوى
في هذه الصفحة

أهداف الدرس

  • استخدام INSERT وUPDATE وDELETE محددة النطاق مع RETURNING.
  • شرح ON CONFLICT وهوية إعادة المحاولة الآمنة.

ضع الثابت داخل الكتابة

قد تفقد قراءة الكمية وحسابها في التطبيق ثم كتابتها حجزاً متزامناً. ضع الحساب وشرط كفاية المخزون في UPDATE واحدة. تفيد القراءة التمهيدية في المراجعة ولا تحجز حقاً. سم أعمدة INSERT وأهل المخطط. تعيد RETURNING الصفوف المتأثرة دون قراءة لاحقة قد تتقادم، وعلى التطبيق تفسير النتيجة الخالية كحالة ذات معنى.

تدرب على تغيير شرطي

افترض صنفاً 4 بكمية تسع في تدريب معزول. تخصم المعاملة ثلاثاً عند الكفاية وتعيد ستاً ثم تتراجع. إذا كان المخزون اثنتين فلا تعيد صفاً ولا تغيره. يعطي الصنف الغائب نتيجة خالية أيضاً فميز الحالة إذا احتاجت الواجهة. روجع المثال بالاستدلال ولم ينفذ على قاعدة معدة.

sql SQL توضيحي؛ النتائج المتوقعة مستنتجة وليست قياسات.
BEGIN;
UPDATE quay_lab.inventory SET quantity = quantity - 3
WHERE item_id = 4 AND quantity >= 3
RETURNING item_id, quantity;
ROLLBACK;
الناتج المتوقع
Expected before rollback when initially 9: item_id = 4, quantity = 6.

تعني النتيجة الخالية فشل شرط أو غياب هدف ولا تبيح إزالة WHERE.

حدد معيار التعارض بوعي

يمكن لـ ON CONFLICT التجاهل أو التحديث وفق قواعد التحكيم الموثقة. تحتاج DO UPDATE معيار تفرد مناسباً، ولا تصلح قيود الاستبعاد للتحكيم في مسار التحديث. يستخدم فرع التحديث العلاقة excluded للقيمة المقترحة، لا VALUES(column) الخاصة بـ MySQL. اختر مفتاح التعارض المقصود ولا تسم كل خطأ تكراراً. يفيد ذلك في مزامنة المراجع ولا يمنع مضاعفة رصيد عند إعادة كل طلب.

استخدم excluded للقيمة المقترحة

العينة المؤقتة جدول تعليمي محلي للجلسة وليست تغيير خدمة للتنفيذ هنا. تنشئ الإضافة الأولى الرصيف Q1 وتحدث الثانية اسمه عند تعارض المفتاح، فتعيد East Quay. ظهرت ON CONFLICT في 9.5 وتتوفر في الإصدارات الحديثة المدعومة، وتراجع التفاصيل في دليل الإصدار. تصف RETURNING صف العبارة لا الكتابات اللاحقة.

sql SQL توضيحي؛ النتائج المتوقعة مستنتجة وليست قياسات.
CREATE TEMP TABLE quays (code text PRIMARY KEY, label text NOT NULL);
INSERT INTO quays (code, label) VALUES ('Q1', 'Old Quay');
INSERT INTO quays (code, label) VALUES ('Q1', 'East Quay')
ON CONFLICT (code) DO UPDATE SET label = excluded.label
RETURNING code, label;
الناتج المتوقع
code | label
Q1   | East Quay

هدف التعارض code، ويأتي الاسم المقترح من excluded.

تحقق من النطاق وهوية الطلب

تدعم DELETE شرطاً وRETURNING للمعرفات المحذوفة. تختلف أقفال TRUNCATE ومحفزاتها فلا تستبدلها عشوائياً. يمكن التراجع عن TRUNCATE العادية في PostgreSQL، ولا يجعلها ذلك مناسبة لحذف تجاري محدد. يحتاج غموض الشبكة حول COMMIT هوية طلب ومصالحة؛ احفظ مفتاحاً فريداً مع الأثر والنتيجة. قد تكرر إعادة آخر عبارة فقط المال أو تفصل التدقيق.

الأخطاء الشائعة وإصلاحها

يكتب الحجز فوق رصيد متزامن

لماذا يحدث؟
حُسبت كمية مطلقة من قراءة قديمة.
كيف تصلحه؟
استخدم UPDATE حسابية مع شرط المخزون وافحص RETURNING.
كيف تتجنب تكراره؟
أبقِ الثوابت في كتابة ذرية أو معاملة مقفلة مراجعة.

there is no unique or exclusion constraint matching ON CONFLICT (42P10)

لماذا يحدث؟
لا يملك الهدف قيداً مناسباً للتحكيم.
كيف تصلحه؟
اختر مفتاحاً موجوداً مناسباً أو صمم ترحيل قيد مراجعاً.
كيف تتجنب تكراره؟
راجع التفرد التجاري قبل صياغة التحديث عند التعارض.

يطبق الدفع المعاد مرتين

لماذا يحدث؟
اختلط تحديث الصف بهوية الحدث المتكرر.
كيف تصلحه؟
احفظ مفتاح طلب فريداً ونتيجته مع معاملة الدفع.
كيف تتجنب تكراره؟
اختبر إعادة الرد الضائع لا تكرار المفاتيح فقط.

اختبر فهمك

1. الكمية اثنتان والطلب ثلاث. فسر نتيجة UPDATE الشرطية وقرار التطبيق التالي.

اعرض الحل المشروح

يفشل الشرط فلا يعاد صف وتبقى اثنتين، فالحجز غير ناجح. إذا ميزت الواجهة الغياب عن عدم الكفاية فافحص وفق عقد اتساق واضح. لا تضعف الشرط ولا تقبل رصيداً سالباً.

2. للجدول رمز محطة فريد. لماذا يناسب DO UPDATE تحديث الاسم ولا يكفي لزيادة دفع معاد؟

اعرض الحل المشروح

يعين تحديث الاسم الحالة المرجعية المطلوبة، فيحافظ تكراره عادة عليها. تزيد كتابة الدفع الأثر في كل إعادة. سجل هوية الحدث منفصلة وأعد نتيجته السابقة عند تكرارها. هوية المرجع والحدث عقدان مختلفان ولو استخدما UNIQUE.

أهم ما تعلمته

  • توضح RETURNING نتيجة الكتابة وتبقى الشروط داخل العبارة.
  • لا تعوض معالجة التعارض تصميم المعاملة أو عدم تكرار الأثر.

المراجع الرسمية