MATCH FULL, MATCH SIMPLE और MATCH PARTIAL के बीच अंतर?


29

मैं एक ध्यान दिया है MATCH SIMPLEऔर MATCH FULL, लेकिन मुझे समझ नहीं आता कि वे क्या करते। मैं देखता हूं डिफ़ॉल्ट है MATCH SIMPLE; लेकिन, कैसे अन्य कर MATCHके लिए खंड FOREIGN KEYबाधा समारोह?

जवाबों:


38

CREATE TABLEमैनुअल के पृष्ठ की जाँच करें :

वहाँ तीन मैच प्रकार हैं: MATCH FULL, MATCH PARTIAL, और MATCH SIMPLE (जो डिफ़ॉल्ट है)। MATCH FULLजब तक सभी विदेशी कुंजी कॉलम अशक्त न हों, तब तक एक बहुस्तरीय विदेशी कुंजी का एक स्तंभ शून्य होने की अनुमति नहीं देगा; यदि वे सभी अशक्त हैं, तो पंक्ति को संदर्भित तालिका में मेल खाने की आवश्यकता नहीं है। MATCH SIMPLEकिसी भी विदेशी कुंजी कॉलम को शून्य होने की अनुमति देता है; यदि उनमें से कोई भी अशक्त है, तो पंक्ति को संदर्भित तालिका में एक मैच के लिए आवश्यक नहीं है। MATCH PARTIALअभी तक लागू नहीं किया गया है। (बेशक, NOT NULLइन मामलों को उत्पन्न होने से रोकने के लिए रेफ़रेंसिंग कॉलम (एस) पर बाधाएं लागू की जा सकती हैं।)

इसके अलावा, विदेशी कुंजी पर अध्याय में :

आम तौर पर, एक संदर्भित पंक्ति को विदेशी कुंजी बाधा को संतुष्ट करने की आवश्यकता नहीं होती है यदि इसके संदर्भ स्तंभों में से कोई भी शून्य है। यदि MATCH FULL विदेशी कुंजी घोषणा में जोड़ा जाता है, तो एक संदर्भित पंक्ति केवल बाधा को संतुष्ट करने से बच जाती है, जब इसके सभी संदर्भ स्तंभ शून्य होते हैं (इसलिए अशक्त और गैर-अशक्त मूल्यों का मिश्रण एक MATCH FULL बाधा को विफल करने की गारंटी है )। यदि आप संदर्भ पंक्तियों को विदेशी कुंजी बाधा को संतुष्ट करने से बचने में सक्षम नहीं होना चाहते हैं, तो संदर्भित कॉलम (एस) को घोषित करें NOT NULL

और वर्तमान मैनुअल या अपनी स्थापना से मेल खाने वाले संस्करण से परामर्श करना सुनिश्चित करें । पुराने संस्करणों के पुराने Google लिंक के लिए मत गिरो।


7

FULLबनाम SIMPLEबनामPARTIAL

जबकि चुना हुआ उत्तर सही है, यदि यह आपके लिए नया है, तो आप इसे कोड के साथ देखना चाह सकते हैं - मुझे लगता है कि इस तरह से करना आसान है।

-- one row with (1,1)
CREATE TABLE foo ( a int, b int,
  PRIMARY KEY (a,b)
);
INSERT INTO foo (a,b) VALUES (1,1);

--
-- two child tables to reference it
-- 
CREATE TABLE t_full ( a int, b int,
  FOREIGN KEY (a,b) REFERENCES foo MATCH FULL
);
CREATE TABLE t_simple ( a int, b int,
  FOREIGN KEY (a,b) REFERENCES foo MATCH SIMPLE
);

तार्किक रूप से, FULLऔर SIMPLE, हम एक पूर्ण मैच सम्मिलित कर सकते हैं।

-- works
INSERT INTO t_full (a,b) VALUES (1,1);
INSERT INTO t_simple (a,b) VALUES (1,1);

समस्या तब आती है जब स्तंभों में से एक है NULL

-- works
INSERT INTO t_simple (a,b) VALUES (1,NULL);

-- fails
INSERT INTO t_full (a,b) VALUES (1,NULL);

सम्मिलित t_fullकरना निम्नलिखित त्रुटि उत्पन्न करता है,

ERROR:  insert or update on table "t_full" violates foreign key constraint "t_full_a_fkey"
DETAIL:  MATCH FULL does not allow mixing of null and nonnull key values.
INSERT 0 1

ठीक है, तो किस बारे में (42,NULL)- यह वह हिस्सा है जिसके बारे में मुझे हमेशा भ्रम हुआ MATCH SIMPLE,

-- works
INSERT INTO t_simple (a,b) VALUES (42,NULL);

उपरोक्त व्यवहार बिना कार्यान्वित के साथ काम नहीं करेगा MATCH PARTIAL, जो संभवत: एक यौगिक सूचकांक के लिए जो आप चाहते हैं, जहां सही-सबसे कॉलम को NULLसंपादित किया जाता है। हालांकि, कुछ लोगों का मानना ​​है कि खराब डिजाइन के लिए पेंडोरा के बक्से को खोलने की एक विधि के रूप में।

सरल परिभाषाएँ और Mnemonics

  • MATCH FULLसब कुछ पूरी तरह से मेल खाना चाहिए , या सभी कॉलम होना चाहिएNULL
  • MATCH SIMPLEअगर एक बात NULLबाधा है तो बस नजरअंदाज कर दिया जाता है।
  • MATCH PARTIALअगर एक बात है NULLइस तथ्य है कि नहीं सब कुछ NULLहै आंशिक रूप से कुछ बाधा के प्रयोजन के लिए समझदार करके बचाया।

एसक्यूएल स्पेक नोट

पोस्टरिटी के लिए, यहाँ SQL युक्ति से परिभाषाएँ हैं <match type>

  • MATCH SIMPLEयदि कम से कम एक संदर्भ स्तंभ शून्य है, तो संदर्भित तालिका की पंक्ति बाधा की जाँच करती है। यदि सभी संदर्भित कॉलम रिक्त नहीं हैं, तो पंक्ति बाधा जाँच पास करती है यदि और केवल संदर्भित तालिका की एक पंक्ति है जो सभी संदर्भ स्तंभों से मेल खाती है।
  • MATCH PARTIAL: यदि सभी संदर्भ कॉलम अशक्त हैं, तो संदर्भित तालिका की पंक्ति बाधा की जाँच करती है। यदि कम से कम एक संदर्भित स्तंभ रिक्त नहीं है, तो पंक्ति बाधा जाँच पास करती है यदि और केवल यदि संदर्भित तालिका की एक पंक्ति है जो सभी गैर-शून्य संदर्भ स्तंभों से मेल खाती है।
  • MATCH FULL: यदि सभी संदर्भ कॉलम अशक्त हैं, तो संदर्भित तालिका की पंक्ति बाधा की जाँच करती है। यदि सभी संदर्भित कॉलम रिक्त नहीं हैं, तो पंक्ति बाधा जाँच पास करती है यदि और केवल संदर्भित तालिका की एक पंक्ति है जो सभी संदर्भ स्तंभों से मेल खाती है। यदि कुछ संदर्भित स्तंभ शून्य है और अन्य संदर्भित स्तंभ गैर-शून्य है, तो संदर्भित तालिका की पंक्ति बाधा चेक का उल्लंघन करती है।

हालांकि यह PostgreSQL विशिष्ट नहीं है लेकिन ये उदाहरण PostgreSQL के साथ दिखाए जाते हैं

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.