2012-04-25 19 views
16

में सशर्त अनूठी बाधा मुझे एक ऐसी स्थिति है जहां मुझे किसी अन्य कॉलम मान के आधार पर कॉलम [विशेषता] पर एक अद्वितीय बाधा लागू करने की आवश्यकता है।ओरेकल डीबी

उदाहरण के लिए, मैं

isDeleted केवल एक मूल्य के नल या 'y' (सक्रिय या हटाए गए) हो सकता है तालिका (आईडी, ईआईडी, नाम, isDeleted) की तरह एक मेज है, और मैं एक बनाना चाहते हैं ईआईडी पर अनन्य बाधा, ISDeleted = ISDeleted जब केवल ISDeleted = null, क्योंकि मुझे कोई परवाह नहीं है कि एक ही आईडी के साथ कई हटाए गए रिकॉर्ड हैं या नहीं। कृपया ध्यान दें कि, ईआईडी में शून्य मूल्य हो सकता है।

मैं इसके लिए ओरेकल डीबी का उपयोग कर रहा हूं।

उत्तर

22

आप कोई बाधा नहीं बना सकते हैं। लेकिन आप एक अद्वितीय फंक्शन-आधारित इंडेक्स बना सकते हैं। यह इस तथ्य का लाभ उठाता है कि ओरेकल नल मूल्यों को अनुक्रमित नहीं करता है - isDeletedNOT NULLNOT NULL को सूचकांक में शामिल नहीं किया जाएगा, इसलिए अद्वितीय बाधा उनके लिए लागू नहीं होगी।

CREATE UNIQUE INDEX one_not_deleted 
    ON table_name((CASE WHEN isDeleted IS NULL 
         THEN eid 
         ELSE null 
         END)); 
+0

'और नल' क्या होगा? क्या यह एक शून्य मान डालेगा या डुप्लिकेट रिकॉर्ड सम्मिलन की अनुमति देगा? – D3V

+0

@ सैंटोशपिंगेल - चूंकि ओरेकल इंडेक्स नल मानों को अनुक्रमित नहीं करते हैं, इसलिए 'ईएलएसई न्यूल' उन पंक्तियों को इंडेक्स से बाहर कर देगा जो डुप्लिकेट की अनुमति देंगे। –