2008-10-22 15 views
19

क्या कोई भी इन कार्यों के बारे में स्पष्ट स्पष्टीकरण/उदाहरण प्रदान कर सकता है, और जब उनका उपयोग करना उचित होता है?पोस्टग्रेस विदेशी कुंजी 'अपडेट पर' और 'डिलीट ऑन' विकल्प कैसे काम करते हैं?

उत्तर

22

सीधे the manual से ...

हम जानते हैं कि विदेशी कुंजी आदेश है कि किसी भी उत्पाद से संबंधित नहीं के निर्माण की अनुमति नहीं देने। लेकिन अगर ऑर्डर के बाद कोई उत्पाद हटा दिया जाता है तो इसका संदर्भ क्या होता है? एसक्यूएल आपको इसे संभालने की अनुमति देता है।

अस्वीकार संदर्भित उत्पाद

आदेश हटा सकते हैं और साथ ही किसी और

कुछ को हटाने: intuitively, हम कुछ ही विकल्प हैं?

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 संदर्भित पंक्ति को हटाने से रोकता है। कोई कार्रवाई का अर्थ यह नहीं है कि यदि बाधा जांचने पर कोई रेफरेंसिंग पंक्तियां अभी भी मौजूद हैं, तो एक त्रुटि उठाई जाती है; यदि आप कुछ भी निर्दिष्ट नहीं करते हैं तो यह डिफ़ॉल्ट व्यवहार है। (इन दो विकल्पों के बीच आवश्यक अंतर यह है कि कोई कार्रवाई चेक को बाद में लेनदेन में स्थगित करने की अनुमति नहीं देती है, जबकि RESTRICT नहीं करता है।) CASCADE निर्दिष्ट करता है कि जब एक संदर्भित पंक्ति हटा दी जाती है, तो संदर्भित पंक्ति (पंक्तियों) को स्वचालित रूप से हटा दिया जाना चाहिए भी। दो अन्य विकल्प हैं: सेट न्यूल और सेट डिफॉल्ट। रेफरेंसिंग पंक्ति को हटाए जाने पर इन संदर्भों को क्रमशः नल या डिफ़ॉल्ट मानों पर सेट किया जाना चाहिए। ध्यान दें कि ये आपको किसी भी बाधाओं को देखने से क्षमा नहीं करते हैं। उदाहरण के लिए, यदि कोई कार्य सेट डिफॉल्ट निर्दिष्ट करता है लेकिन डिफ़ॉल्ट मान विदेशी कुंजी को पूरा नहीं करेगा, तो ऑपरेशन विफल हो जाएगा।

डिलीट करने के लिए एनालॉगस भी अद्यतन पर है जिसे संदर्भित कॉलम बदल दिया जाता है (अपडेट किया गया)। संभव कार्य एक ही हैं।

संपादित करें: आप इस संबंधित सवाल पर एक नज़र लेने के लिए चाहते हो सकता है: When/Why to use Cascading in SQL Server?। प्रश्न/उत्तर के पीछे अवधारणाएं समान हैं।

0

मेरे पास एक PostGreSQL डेटाबेस है और जब मैं एक उपयोगकर्ता हूं जिसे मैं डेटाबेस से हटाता हूं और मुझे अन्य तालिका से इसकी जानकारी को हटाने की आवश्यकता है, तो मैं हटाएं का उपयोग करता हूं। इस तरह मुझे केवल 1 डिलीट करने की आवश्यकता है और एफके जिस पर हटा है, वह अन्य तालिका से जानकारी हटा देगा।

आप ऑन अपडेट के साथ ऐसा ही कर सकते हैं। यदि आप तालिका अपडेट करते हैं और फ़ील्ड में एफके पर एफके है, तो एफके पर कोई बदलाव किया जाता है तो आपको एफके टेबल पर देखा जाएगा।

0

क्या दाओक कहता है सच है ... यह सुविधाजनक हो सकता है। दूसरी तरफ, डेटाबेस में चीजें स्वचालित रूप से होती हैं, एक वास्तविक समस्या हो सकती है, खासकर जब डेटा को खत्म करने की बात आती है। यह संभव है कि भविष्य में कोई इस तथ्य पर भरोसा करेगा कि एफके आमतौर पर बच्चों के होने पर माता-पिता को हटाने से रोकते हैं और यह नहीं समझते कि ऑन डिस्प्ले कैस्केड का उपयोग न केवल हटाने को रोकता है, बल्कि दर्जनों में डेटा की भारी मात्रा में डेटा बनाता है कैस्केडिंग डिलीट के झरने के लिए अन्य टेबल दूर चले जाते हैं।

@ आर्थर की टिप्पणी।

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

यह डेटाबेस के डिजाइन को कितनी अच्छी तरह से डिजाइन करने के लिए बिल्कुल कुछ नहीं है। ट्रिगर्स द्वारा पेश किए गए परिचालन मुद्दों के साथ इसमें सब कुछ है।

+1

मुझे नहीं लगता कि स्कीमा सही ढंग से डिज़ाइन की गई है तो यह एक समस्या है। आम तौर पर डेटा के बच्चे (एफके) अपने माता-पिता के बिना वास्तव में उपयोगी नहीं होते हैं। –

+0

यह एक उचित बयान है। लेकिन अधिक चीजें जो बिना किसी सफल डेटाबेस के कम इरादे के होती हैं। उपरोक्त उत्तर में संपादन देखें। –

+0

आपको यह तय करना होगा कि क्या डीबी सिर्फ एक आवेदन के लिए डेटा डंप है, या यदि डीबी के पास मूल्य/अर्थ है। जब कोई डीबी ऐप के बिना काम कर सकता है - प्रत्यक्ष डेटा लोड, सीधी क्वेरी एक्सेस इत्यादि - आपको डीबी परत में नियमों को परिभाषित करना होगा, क्योंकि ऐप आपके लिए उन चीजों को करने के लिए नहीं है। मेरे अनुभव में, जूनियर डेवलपर्स डीबी को एक ऐप द्वारा नियंत्रित के रूप में देखते हैं, जबकि वरिष्ठ डेवलपर्स (जिन्हें कई बार जला दिया गया है) डीबी को अपने आप खड़े होने के लिए डिजाइन करते हैं। याद रखें, एप खत्म होने के बाद डीबी लंबे समय तक जी सकते हैं। यह केवल encapsulation का सिद्धांत है, डेटाबेस पर लागू है। –

0

कैस्केड डिलीट या कैस्केड अपडेट के सभी काम करने के तरीके को लिखने के बजाय, आप बस इसके बजाय एक चेतावनी संदेश लिख सकते हैं। पहिया को पुनर्निर्मित करने से बहुत आसान है, और यह क्लाइंट को स्पष्ट करता है (और नए डेवलपर कोड उठा रहे हैं)

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