2015-03-27 4 views
5

मेरे पास primary key और एक foreign key के साथ तालिका same table primary key का संदर्भ है। यानी एक ही टेबल में माता-पिता और बच्चे हैं। एसक्यूएल सेवर में डिलीट नियम के लिए तीन विकल्प हैं। लेकिन "NO ACTION" नियम को हटाने के लिए केवल संभव है। मैं समझता हूं कि चक्र और चेनिंग के कारण "cascade" delete सेट करना संभव नहीं है। लेकिन अन्य विकल्पों की अनुमति क्यों नहीं है? विशेष रूप से "SET NULL" एक।स्वयं संदर्भ संबंधों पर हटाए गए सेट पर

अभी मुझे इसे मैन्युअल रूप से करना है। मुझे बाल रिकॉर्ड ढूंढना है और विदेशी कुंजी को शून्य पर सेट करना है। उसके बाद मैं माता-पिता को हटा सकता हूं। इसके लिए नियम निर्धारित करना क्यों संभव नहीं है?

+1

आपके मामले में मुझे लगता है कि ** हटाएं ट्रिगर ** जो आप चाहते हैं उसे करें। इसे देखें [ट्रिगर बनाएं] (https://msdn.microsoft.com/en-us/library/ms189799.aspx) –

+0

मैं ट्रिगर बनाने से बचना चाहता हूं लेकिन यह दिन के अंत में एकमात्र समाधान हो सकता है। मैं जानना चाहता था कि एसक्यूएल सर्वर को मजबूर करने के लिए कुछ डीडीएल वर्कअराउंड है या नहीं, "पूरी तरह से सेट करें"। और यदि यह संभव नहीं है, तो क्यों? क्योंकि मैं "ओवरलेट सेट नल" को अक्षम करने के कारणों को नहीं देख सकता क्योंकि "ओवरलेटेड कैस्केड" अक्षम करने के लिए समान है। कोई चक्र नहीं हैं और न ही एकाधिक कैस्केड पथ हैं। मैं बस यह सुनिश्चित करना चाहता हूं कि एमएस विशलिस्ट में पोस्ट करने से पहले कोई तार्किक कारण नहीं है। – mattti

+0

@ मत्ती मुझे यह मिला [हटाए गए सेट पर नल] (http://www.sqlteam.com/article/using-set-null-and-set-default-with-foreign-key-constraints) –

उत्तर

1

क्योंकि यह एक साथ एक ही मेज पर दो क्रियाएं हैं जो कर रहे हैं प्रदर्शन नहीं कर सकते:

माता पिता -delete।

- बच्चों को अद्यतन करें।

एक परिवर्तनशील तालिका एक मेज है कि, एक अद्यतन द्वारा संशोधित हटा सकते हैं या विवरण, या एक मेज है कि एक हटाना कैस्केड बाधा के प्रभाव के द्वारा अद्यतन किया जा सकता है INSERT किया जा रहा है।

आप एक ऐसी प्रक्रिया बनाकर इसे मैन्युअल रूप से करने से दूर कर सकते हैं जो रिकॉर्ड को हटाने और बच्चों को नल पर सेट करने के लिए मूल कुंजी रखेगा।

procedure(parent_id) --takes the id as a parameter 

    update table set null where foreign_key = parent_id; 

    delete from table where id = parent_id; 

end; 
+0

क्या आप उद्धृत कर सकते हैं संदर्भ? –

संबंधित मुद्दे