كيف يعمل مفتاح Postgres الخارجي "عند التحديث" وخيارات "عند الحذف"؟

StackOverflow https://stackoverflow.com/questions/225881

سؤال

هل يمكن لأي شخص تقديم شرح/مثال واضح لما تفعله هذه الوظائف، ومتى يكون من المناسب استخدامها؟

هل كانت مفيدة؟

المحلول

مباشرة من الدليل...

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

عدم السماح بحذف المنتج المشار إليه

حذف الطلبات كذلك

شيء آخر؟

CREATE TABLE order_items (
 product_no integer REFERENCES products ON DELETE RESTRICT,
 order_id integer REFERENCES orders ON DELETE CASCADE,
 quantity integer,
 PRIMARY KEY (product_no, order_id)
);

يعد تقييد عمليات الحذف المتتالية الخيارين الأكثر شيوعًا.يمنع RESTRICT حذف الصف المشار إليه.عدم اتخاذ أي إجراء يعني أنه في حالة وجود أي صفوف مرجعية عند التحقق من القيد، يظهر خطأ؛هذا هو السلوك الافتراضي إذا لم تحدد أي شيء.(الفرق الأساسي بين هذين الخيارين هو أن NO ACTION يسمح بتأجيل الشيك إلى وقت لاحق من المعاملة، في حين أن RESTRICT لا يسمح بذلك.) تحدد CASCADE أنه عند حذف صف مرجعي، يجب حذف الصف (الصفوف) الذي يشير إليه تلقائيًا أيضًا.هناك خياران آخران:تعيين NULL وتعيين الافتراضي.يؤدي ذلك إلى تعيين الأعمدة المرجعية على قيم فارغة أو قيم افتراضية، على التوالي، عند حذف الصف المشار إليه.لاحظ أن هذا لا يعفيك من مراعاة أي قيود.على سبيل المثال، إذا قام أحد الإجراءات بتحديد SET DEFAULT ولكن القيمة الافتراضية لا تفي بالمفتاح الخارجي، فستفشل العملية.

مماثل لـ ON DELETE، يوجد أيضًا ON UPDATE والذي يتم استدعاؤه عند تغيير عمود مرجعي (تحديث).الإجراءات المحتملة هي نفسها.

يحرر: قد ترغب في إلقاء نظرة على هذا السؤال ذي الصلة: متى/لماذا تستخدم Cascading في SQL Server؟.المفاهيم الكامنة وراء السؤال/الإجابات هي نفسها.

نصائح أخرى

ولدي قاعدة بيانات كيو وأنا أستخدم في حذف عندما يكون لدي المستخدم الذي يمكنني حذف من قاعدة البيانات وأنا بحاجة إلى حذفها من المعلومات من الجدول الآخر. هذه الطرق يجب أن أفعل سوى 1 حذف وسوف FK التي لديها ON حذف حذف المعلومات من الجدول الآخر.

ويمكن أن تفعل الشيء نفسه مع ON تحديث. إذا قمت بتحديث الجدول والحقل لديها FK مع تشغيل التحديث، إذا تم إجراء تغيير على FK سوف يكون لاحظت على الطاولة FK.

وماذا يقول ضعوك غير صحيح ... يمكن أن تكون مريحة نوعا ما. من ناحية أخرى، وبعد الأمور التلقائى في قاعدة البيانات يمكن أن يكون مشكلة حقيقية، وخصوصا عندما يتعلق الأمر بالقضاء البيانات. انه من الممكن ان في شخص ما في المستقبل سوف تعتمد على حقيقة أن FKS عادة ما تمنع الحذف من الآباء والأمهات عندما يكون هناك أطفال لا يدركون أن استخدامك لفي حذف تتالي ليس فقط لا يمنع الحذف، فإنه يجعل كميات هائلة من البيانات في عشرات الجداول الأخرى تزول بفضل شلال المتتالية حذف.

و @تعليق آرثر.

وعلى نحو أكثر تواترا الأشياء "الخفية" تحدث في قاعدة بيانات أقل عرضة يصبح أن أي شخص سوف يكون من أي وقت مضى جيدا على التعامل مع ما يجري. مشغلات (وهذا هو في الأساس الزناد) يمكن أن يسبب لي عمل بسيط من حذف صف واحد، أن يكون واسعة النطاق في جميع أنحاء عواقب قاعدة البيانات الخاصة بي. I يصدر بيانا حذف وتتأثر 17 الجداول مع مجموعات من مشغلات والقيود ولا شيء من هذا واضحا على الفور إلى مصدر الأمر. OTOH، إذا أضع حذف الوالد وجميع أبنائها في إجراء فمن السهل للغاية واضحة لأحد أن نرى بالضبط ما يحدث عندما يصدر الأمر.

وله على الاطلاق للقيام مع مدى I تصميم قاعدة بيانات شيء. لديها كل ما يتعلق بالقضايا التشغيلية المقدمة من قبل المشغلات.

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top