اذهب إلى المحتوى

السؤال

نشر

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

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

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

Recommended Posts

  • 1
نشر

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

SET FOREIGN_KEY_CHECKS=0;

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

SET FOREIGN_KEY_CHECKS=1;

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

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

  • 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

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...