it-swarm.asia

شرح جيد لسلوك التعاقب (عند الحذف / التحديث)

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

على سبيل المثال ، إذا كان لدي جدولان - Parent و Child - بمفتاح خارجي على Child يشير إلى Parent ولديه ON DELETE CASCADE ، ما هي السجلات التي تتسبب في شلال وما هي السجلات التي يتم حذفها من شلال؟ أول تخميني هو حذف سجلات Child عندما يتم حذف سجلات Parent ، نظرًا لأن سجلات Child تعتمد على سجلات Parent ، لكن ON DELETE غامض؛ قد يعني حذف السجل Parent عندما يتم حذف السجل Child ، أو قد يعني حذف السجل Child عند حذف Parent. إذن ما هو؟

أتمنى أن يكون بناء الجملة ON PARENT DELETE, CASCADE ، ON FOREIGN DELETE, CASCADE أو شيء مشابه لإزالة الغموض. هل لدى أي شخص استذكار لتذكر هذا؟

111
Johntron

إذا كنت تحب المصطلحين Parent و Child وتشعر أنه من السهل تذكرها ، فقد ترغب في ترجمة ON DELETE CASCADE إلى Leave No Orphans!

مما يعني أنه عند حذف صف Parent (قتل) ، يجب ألا يبقى أي صف معزول على قيد الحياة في الجدول Child. يتم قتل (حذف) جميع أطفال الصف الأصل. إذا كان لدى أي من هؤلاء الأطفال أحفاد (في جدول آخر من خلال مفتاح خارجي آخر) وهناك ON DELETE CASCADE مُعرَّف ، يجب قتلهم أيضًا (وجميع الأحفاد ، طالما كان هناك تأثير شلال محدد.)

ال FOREIGN KEY يمكن وصف القيد نفسه بأنه Allow No Orphans! (في المقام الأول). لا يجب السماح بأي Child (مكتوب) في الجدول الفرعي إذا لم يكن به Parent (صف في الجدول الرئيسي).

من أجل الاتساق ، ON DELETE RESTRICT يمكن ترجمتها إلى (أقل عدوانية) You Can't Kill Parents! يمكن فقط قتل الصفوف الخالية من الأطفال (محذوف.)

159
ypercubeᵀᴹ

على سبيل المثال ، إذا كان لدي جدولان - الأصل والطفل - حيث تكون السجلات الفرعية مملوكة لسجلات الأصل ، فما الجدول الذي يحتاج إلى ON DELETE CASCADE؟

عند حذف CASCADE عبارة اختيارية في إعلان مفتاح خارجي. لذلك يذهب مع تصريح المفتاح الخارجي. (المعنى ، في جدول "الطفل".)

... قد يعني حذف السجل الأصل عند حذف السجل الفرعي ، أو قد يعني حذف السجل الفرعي عند حذف الأصل. إذن ما هو؟

تتمثل إحدى طرق تفسير إعلان المفتاح الخارجي في أن "جميع القيم الصالحة لهذا العمود تأتي من" that_column "في" that_table ". عندما تحذف صفًا في جدول "تابع" ، فلا أحد يهتم. لا يؤثر على سلامة البيانات.

عند حذف صف من جدول "الأصل" - من "that_table" - فإنك تزيل قيمة صالحة من القيم المحتملة لجدول "تابع". للحفاظ على تكامل البيانات ، عليك القيام بشيء إلى جدول "تابع". الحذف المتتالي هو شيء واحد يمكنك القيام به.


الفصل والآية من مستندات PostgreSQL .

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

34
Mike Sherrill 'Cat Recall'

مزود: 2011 المواصفات

هناك خمسة خيارات لـ ON DELETE ، و ON UPDATE التي يمكن أن تنطبق على FOREIGN KEY. تسمى هذه <referential actions> ، مباشرة من مواصفات SQL: 2011

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

يؤسس المفتاح الأجنبي العلاقة التابعة. ال <referential action> يحدد ما يحدث عندما يتم حل العلاقة.

مثال/استعارة/شرح

في هذا المثال ، سنقبل النموذج المشترك للمجتمع والاقتصاد: حيث أن كل business هي شركة تحافظ على علاقة مع bourgeoisie من خلال fatcat_owner.

CREATE TABLE bourgeoisie(
  fatcat_owner varchar(100) PRIMARY KEY
);
INSERT INTO bourgeoisie(fatcat_owner) VALUES
  ( 'Koch Brothers' );

CREATE TABLE business (
  name         varchar(100),
  fatcat_owner varchar(100) REFERENCES bourgeoisie
);
INSERT INTO business(name, fatcat_owner)
  VALUES ('Georgia-Pacific', 'Koch Brothers');

إذا كانت جميع business تتأثر مباشرة بـ bourgeoisie عن طريق fatcat_owner ثم ماذا تفعل بعد الثورة العمالية عندما تقوم بتطهير fatcat_owners ولها مجتمع بلا طبقات؟

-- Viva la revolución 
BEGIN;
  DELETE FROM bourgeoisie;
END;

لديك عدد قليل من الخيارات هنا،

  • أوقفوا الثورة. في لغة SQL ، RESTRICT. يعتقد بعض الناس أن هذا هو أقل الشر ، لكنهم عادة ما يخطئون.
  • السماح لها أن تستمر. إذا كان الأمر كذلك عندما تحدث الثورة ، فإن SQL تعطيك أربعة خيارات

    • SET NULL -- اتركه فارغا. من يدري ، ربما يتم استعادة الرأسمالية ، يأتي bourgeoisie ويملأ القلة قائمة fatcat_owners. ملاحظة مهمة ، يجب أن يكون العمود NULLABLE (ليس NOT NULL) أو هذا لا يمكن أن يحدث.
    • SET DEFAULT - ربما كان لديك DEFAULT عالجت هذا؟ يمكن لـ DEFAULT استدعاء دالة. ربما مخططك جاهز للثورة بالفعل.
    • CASCADE - لا يوجد تحكم في الضرر. إذا ذهبت bourgeoisie ، فإن business كذلك. إذا كان النشاط التجاري يجب أن يكون له fatcat_pig ، ثم يكون من المنطقي في بعض الأحيان فقدان البيانات بدلاً من أن يكون لديك نشاط غير تجاري في جدول business.
    • NO ACTION - هذه في الأساس طريقة لتأخير الفحص ، في MySQL لا تختلف عن RESTRICT ، ولكن في PostgreSQL ، ستتمكن من القيام بذلك

      -- Not a real revolution.
      -- requires constraint be DEFERRABLE INITIALLY DEFERRED
      BEGIN;
        SET CONSTRAINTS ALL DEFERRED;
        DELETE FROM bourgeoisie;
        INSERT INTO bourgeoisie VALUES ( 'Putin' );
        UPDATE business SET fatcat_pig = 'Putin';
      END;
      

      في مثل هذا النظام ، يتم التحقق من القيد فقط قبل تنفيذ المعاملة. قد يؤدي هذا إلى وقف الثورة ، ولكن يمكنك استرداد المعاملة - إلى حد ما من "التعافي".

4
Evan Carroll

سيكون ذاكري بسيط

عند حذف الأصل CASCADE [بحذف] هنا

يخبرك هذا بالحذف (الحذف للوالد) الذي يتم تتابعه ، حيث يذهب عبارة ON DELETE CASCADE (على الطفل) ، وما يتم حذفه ( الطفل).

2
msouth