जैसे @lad2025 ने टिप्पणी कीए> , status वास्तव में boolean होना चाहिए
. सस्ता, साफ-सुथरा।
किसी भी तरह से, आप अपना नियम आंशिक अद्वितीय अनुक्रमणिका<के साथ लागू कर सकते हैं /मजबूत> :
status = 'Active' . के साथ शून्य या एक पंक्ति की अनुमति देने के लिए संपूर्ण तालिका में :
CREATE UNIQUE INDEX tbl_active_uni ON tbl (status)
WHERE status = 'Active';
status = 'Active' . के साथ शून्य या एक पंक्ति की अनुमति देने के लिए प्रति userid , userid बनाएं अनुक्रमित कॉलम:
CREATE UNIQUE INDEX tbl_userid_active_uni ON tbl (userid)
WHERE status = 'Active';
ध्यान दें कि userid IS NULL अद्वितीय उल्लंघनों को ट्रिगर नहीं करेगा, क्योंकि दो NULL मानों को कभी भी समान नहीं माना जाता है। userid सेट NOT NULL होना चाहिए
इस मामले में।
अनुक्रमणिका और बाधा क्यों नहीं?
अपने टिप्पणी में प्रश्न
:यह एक इंडेक्स है, न कि CONSTRAINT
।
पहले मामले का सूचकांक छोटा . है , एक या कोई पंक्ति नहीं पकड़े हुए।
दूसरे मामले के लिए अनुक्रमणिका प्रति मौजूदा userid एक पंक्ति रखती है , लेकिन यह सबसे सस्ता और तेज़ तरीका . है स्वच्छ और सुरक्षित होने के अलावा। इसे तेज़ करने के लिए आपको किसी भी स्थिति में अन्य पंक्तियों की जाँच करने के लिए एक अनुक्रमणिका की आवश्यकता होगी।
आपके पास CHECK नहीं हो सकता है अन्य पंक्तियों पर बाधा जांच - कम से कम स्वच्छ, विश्वसनीय फैशन में नहीं। ऐसे कई तरीके हैं जिनकी मैं निश्चित रूप से अनुशंसा नहीं करूंगा इस मामले के लिए:
- ट्रिगर बनाम चेक बाधा
- 3 टेबलों के बीच चक्रीय निर्भरता (गोलाकार संदर्भ) से कैसे बचें?
- डंप को पुनर्स्थापित करते समय सभी बाधाओं और तालिका जांचों को अक्षम करें
अगर आप UNIQUE . का इस्तेमाल करते हैं (userid, status) . पर प्रतिबंध (जिसे पृष्ठभूमि में एक अद्वितीय अनुक्रमणिका के साथ भी कार्यान्वित किया जाता है!), आप इसे आंशिक नहीं बना सकते , और सभी संयोजन अद्वितीय होने के लिए लागू किए जाते हैं। आप कर सकते थे यदि आप status IS NULL . के साथ काम करते हैं, तब भी इसका उपयोग करें 'Active' . को छोड़कर सभी मामलों के लिए मामला। लेकिन यह वास्तव में सभी . सहित एक बहुत बड़ा सूचकांक लागू करेगा पंक्तियाँ।