दिलचस्प पोस्ट
सी # आवेदन में वैश्विक कुंजीपटल कैप्चर मैं jQuery में ऊंचाई और स्क्रॉलिंग विंडो की स्थिति कैसे निर्धारित करूं? एकाधिक रंगीन पाठ के साथ एकल टेक्स्टदृश्य jQuery इवेंट: एक div का HTML / पाठ में परिवर्तन का पता लगाएं एक विशिष्ट समय-क्षेत्र में सप्ताह के दिन php में कैसे खोजें getActionBar शून्य प्रदान करता है Photos.app से अंतिम चित्र प्राप्त करें? एक फ़ोल्डर संरचना के समान ब्लॉग पोस्ट लिंक बनाएं टेक्स्ट फ़ील्ड के शब्द गणना आंकड़ों को निर्धारित करने के लिए SQL का उपयोग करना कैसे एक पूरी जार फ़ाइल decompile करने के लिए? एंड्रॉइड: .apk प्रोग्राममैटिक रूप से इंस्टॉल करें क्या प्लेटफार्मों में कुछ 8-बिट वर्णों के अलावा कुछ है? पुनरावर्तक, सूची दृश्य, डाटालिस्ट, डेटाग्रिड, ग्रिडव्यू … कौन सा चुनना है? एक वसंत बूट अनुप्रयोग को सही तरीके से कैसे बंद करें? हेरोको + नोड.जेएस त्रुटि (वेब ​​प्रक्षेपण 60 सेकंड के भीतर $ PORT में बाँधने में विफल)

सशर्त अद्वितीय बाधा

मेरे पास ऐसी स्थिति है जहां मुझे स्तंभों के सेट पर एक अद्वितीय बाधा को लागू करने की आवश्यकता है, लेकिन केवल एक कॉलम के एक मूल्य के लिए

इसलिए उदाहरण के लिए मेरे पास तालिका (आईडी, नाम, रिकार्डस्टैटस) जैसी तालिका है।

रिकार्डस्टैटस में केवल 1 या 2 का मान (सक्रिय या हटाया गया) हो सकता है, और मैं केवल रिकॉर्डस्टैट = 1 पर (आईडी, रिकार्डस्टैटस) पर एक अद्वितीय बाधा बनाना चाहता हूं, क्योंकि मुझे कोई परवाह नहीं है कि इसके साथ कई हटाए गए रिकॉर्ड हैं आईडी।

ट्रिगर लिखने के अलावा, क्या मैं ऐसा कर सकता हूं?

मैं SQL सर्वर 2005 का उपयोग कर रहा हूँ

वेब के समाधान से एकत्रित समाधान "सशर्त अद्वितीय बाधा"

इस तरह एक चेक बाधा जोड़ें अंतर यह है, यदि आप स्थिति = 1 और गणना> 0, तो आप झूठी वापसी करेंगे

http://msdn.microsoft.com/en-us/library/ms188258.aspx

CREATE TABLE CheckConstraint ( Id TINYINT, Name VARCHAR(50), RecordStatus TINYINT ) GO CREATE FUNCTION CheckActiveCount( @Id INT ) RETURNS INT AS BEGIN DECLARE @ret INT; SELECT @ret = COUNT(*) FROM CheckConstraint WHERE Id = @Id AND RecordStatus = 1; RETURN @ret; END; GO ALTER TABLE CheckConstraint ADD CONSTRAINT CheckActiveCountConstraint CHECK (NOT (dbo.CheckActiveCount(Id) > 1 AND RecordStatus = 1)); INSERT INTO CheckConstraint VALUES (1, 'No Problems', 2); INSERT INTO CheckConstraint VALUES (1, 'No Problems', 2); INSERT INTO CheckConstraint VALUES (1, 'No Problems', 2); INSERT INTO CheckConstraint VALUES (1, 'No Problems', 1); INSERT INTO CheckConstraint VALUES (2, 'Oh no!', 1); INSERT INTO CheckConstraint VALUES (2, 'Oh no!', 2); -- Msg 547, Level 16, State 0, Line 14 -- The INSERT statement conflicted with the CHECK constraint "CheckActiveCountConstraint". The conflict occurred in database "TestSchema", table "dbo.CheckConstraint". INSERT INTO CheckConstraint VALUES (2, 'Oh no!', 1); SELECT * FROM CheckConstraint; -- Id Name RecordStatus -- ---- ------------ ------------ -- 1 No Problems 2 -- 1 No Problems 2 -- 1 No Problems 2 -- 1 No Problems 1 -- 2 Oh no! 1 -- 2 Oh no! 2 ALTER TABLE CheckConstraint DROP CONSTRAINT CheckActiveCountConstraint; DROP FUNCTION CheckActiveCount; DROP TABLE CheckConstraint; 

देखें, फ़िल्टर किए गए सूचकांक प्रलेखन (जोर खान) से:

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

और यह एक उदाहरण है जो एक अद्वितीय सूचकांक के साथ एक फ़िल्टर के अनुसार परिभाषित करता है:

 create unique index [MyIndex] on [MyTable]([ID]) where [RecordStatus] = 1 

यह अनिवार्य रूप से ID विशिष्टता को लागू करता है जब RecordStatus 1

नोट: फ़िल्टर्ड सूचकांक SQL Server 2008 में पेश किया गया था। SQL सर्वर के पिछले संस्करणों के लिए, कृपया यह उत्तर देखें।

आप हटाए गए रिकॉर्ड्स को किसी तालिका में स्थानांतरित कर सकते हैं जो बाधा का अभाव है, और संभवतः एक मेज के रूप को बनाए रखने के लिए दो तालिकाओं के यूनियन के साथ एक दृश्य का उपयोग करें।

आप ऐसा कर सकते हैं वास्तव में एक hacky तरीके से …

अपनी तालिका पर एक स्केमाबाउंड दृश्य बनाएं।

दृश्य बनाओ जो भी चयन करें * तालिका से जहां रिकार्डस्टैट = 1

अब अपने इच्छित क्षेत्रों के साथ दृश्य पर एक अद्वितीय बाधा बनाएं

हालांकि स्कीमाबाउंड के विचारों के बारे में एक नोट, हालांकि, यदि आप अंतर्निहित तालिकाओं को बदलते हैं, तो आपको दृश्य को फिर से बनाना होगा। उस वजह से बहुत सारे मिलते हैं

क्योंकि, आप डुप्लिकेट को अनुमति देने जा रहे हैं, एक अद्वितीय बाधा काम नहीं करेगा। आप रिकॉर्डस्टास कॉलम के लिए एक चेक बाधा और INSERT के लिए एक संग्रहीत प्रक्रिया बना सकते हैं जो डुप्लिकेट आईडी डालने से पहले मौजूदा सक्रिय रिकॉर्ड की जांच करता है।

यदि आप रिक्त स्थान के रूप में रिक्त स्थान के रूप में नल का उपयोग नहीं कर सकते हैं, तो आप अपने विचार को फ़ंक्शन-आधारित सूचकांक के साथ जोड़ सकते हैं रिकार्डस्टैटस उन मूल्यों में से एक नहीं है, जो आपकी बाधा (और अन्यथा रिकार्डस्टैट्स) पर विचार करना चाहते हैं और उस पर एक अनुक्रमणिका बनाते हैं, तो एक फ़ंक्शन बनाते हैं।

इसका लाभ होगा कि आपको अपनी बाधा में तालिका में अन्य पंक्तियों का स्पष्ट रूप से परीक्षण करने की ज़रूरत नहीं है, जिससे आप प्रदर्शन समस्याएं पैदा कर सकते हैं।

मुझे कहना चाहिए कि मैं एसक्यूएल सर्वर बिल्कुल नहीं जानता, लेकिन मैंने इस दृष्टिकोण को सफलतापूर्वक ओरेकल में इस्तेमाल किया है