• 1

كيف يمكنني تعطيل foreign key مؤقتًا في جانغو Django؟

لدي نموذجان models في جانغو Django، لكل منهما مفتاح foreign key للآخر. يؤدي حذف نسخ من النماذج إلى إرجاع خطأ بسبب قيد مفتاح foreign key:

cursor.execute("DELETE FROM items WHERE id = %s", id_)
transaction.commit_unless_managed()  # يظهر خطأ هنا بسبب foreign key

هل من الممكن تعطيل القيود مؤقتًا وحذفها على أي حال؟ أم يجب أن أقوم بتنفيذ جمل SQL مباشرة على قاعدة البيانات؟

1 شخص أعجب بهذا

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية
  • 1

لإيقاف تشغيل قيد مفتاح foreign key بشكل عام، يمكن القيام بالتالي:

SET FOREIGN_KEY_CHECKS=0;

ولإعادة تشغيله، كل ما عليك فعله هو تغير القيمة إلى 1، لتصبح الجملة كالتالي:

SET FOREIGN_KEY_CHECKS=1;

لاحظ أن هذا التغير يؤثر فقط على الجلسة الحالية session ولا يؤثر على MySQL بشكل عام، ولتغير هذا الأمر يمكنك أن تضيف كلمة GLOBAL بعد كلمة SET وسوف يتم تطبيق هذا التغير على الجلسة الحالية وكل الجلسات المستقبلية.

ملاحظة هامة: يجب عليك القيام بذلك فقط عندما تقوم بوضع صيانة maintenance mode. لأنه قد يؤدي إلى عدم تناسق البيانات، وبالتالي ظهور أخطاء عند زيارة الموقع في وضع الإطلاق deployment mode.

1 شخص أعجب بهذا

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية
  • 0

يمكنك أيضاً بدلاً من تعطيل القيد الخاص بك، قم بتعديله بشكل دائم إلى ON DELETE SET NULL. سيؤدي ذلك إلى تحقيق شيء مماثل ولن تضطر إلى تشغيل التحقق من المفاتيح وإيقاف تشغيله:

//تخلص من القيود الحالية
ALTER TABLE t1 DROP FOREIGN KEY fk_name1; 
ALTER TABLE t2 DROP FOREIGN KEY fk_name2;
ALTER TABLE t1
//أضف القيد
  ADD FOREIGN KEY (table2_id) 
        REFERENCES table2(id)
        ON DELETE SET NULL  
ALTER TABLE t2 
  ADD FOREIGN KEY (table1_id) 
        REFERENCES table1(id)
        ON DELETE SET NULL //إضافة قيود أخرى

 

تمّ تعديل بواسطة Ali Haidar Ahmad
1 شخص أعجب بهذا

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية

يجب أن تكون عضوًا لدينا لتتمكّن من التعليق

انشاء حساب جديد

يستغرق التسجيل بضع ثوان فقط


سجّل حسابًا جديدًا

تسجيل الدخول

تملك حسابا مسجّلا بالفعل؟


سجّل دخولك الآن