दिलचस्प पोस्ट
PostgreSQL डेटाबेस को कहाँ संग्रहीत करता है? CSS3 संक्रमण प्रदर्शन संपत्ति के साथ काम नहीं करता घोंसले के समानांतर का इंतजार समानांतर में है मिश्रित मोड विधानसभा.नेट 4 में कैसे बैच फ़ाइल के माध्यम से आकार के साथ सभी फ़ोल्डर की सूची जावा में सिंथेटिक क्लास XML पर JSON को पसंद करते समय? आप अपवाद सुरक्षित तरीके से MATLAB में संसाधनों को कैसे प्रबंधित करते हैं? (जैसे "कोशिश करें … अंत में") मैं Python में एक नई लाइन (chomp) को कैसे निकाल सकता / सकती हूं? Marsmallow: रन टाइम क्रैश ऐप पर अनुमतियों को बदलने जब PHP में पास-बाय-रेफरे को भेजा जाए इन सभी OpenCV पायथन इंटरफेस के बीच क्या अलग है? AppSettings बनाम ऐप्लिकेशन सैटिंग्स के पेशेवरों और विपक्ष (.NET app.config / Web.config) PHP का उपयोग करके एक फ़ाइल अपलोड करें भरने के लिए एक अन्य चर का उपयोग करके घनत्व 2d प्लॉट (geom_tile के समान)?

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

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

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

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

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

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

Solutions Collecting From Web of "सशर्त अद्वितीय बाधा"

इस तरह एक चेक बाधा जोड़ें अंतर यह है, यदि आप स्थिति = 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 के लिए एक संग्रहीत प्रक्रिया बना सकते हैं जो डुप्लिकेट आईडी डालने से पहले मौजूदा सक्रिय रिकॉर्ड की जांच करता है।

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

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

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