2011-02-10 22 views
11

मैं दो स्तंभों के लिए एक अनूठा सूचकांक बाधा पैदा करने के लिए कोशिश कर रहा हूँ, लेकिन केवल जब एक और स्तंभ उदाहरण के लिए मान 1 होता है, column_1 और column_2 अद्वितीय होना चाहिए केवल जब active = 1 । कोई पंक्ति शामिल active = 0 एक और पंक्ति के साथ column_1 और column_2 के लिए मूल्यों को साझा कर सकते, क्या active के लिए अन्य पंक्ति का मूल्य है की परवाह किए बिना। लेकिन पंक्तियां जहां active = 1column_1 या column_2 के मानों को अन्य पंक्तियों के साथ साझा नहीं कर सकता है जिसमें active = 1 है।अद्वितीय बाधा, केवल जब एक क्षेत्र में एक विशिष्ट मान

मैं "शेयर" से क्या मतलब उसी स्तंभ (ओं) में एक ही मूल्य (रों) होने दो पंक्तियों है। उदाहरण: row1.a = row2.a और row1.b = row2.b. मान केवल तभी साझा किए जाएंगे जब पंक्ति 1 में दोनों कॉलम पंक्ति 2 में अन्य दो स्तंभों से मेल खाते हों।

मुझे उम्मीद है कि मैंने खुद को स्पष्ट कर दिया है। : \

उत्तर

0

इंडेक्स बाहरी प्रभावों के अज्ञेयवादी हैं। इस प्रकार की बाधा आपके डेटाबेस के बाहर लागू की जानी चाहिए।

0

एसक्यूएल सर्वर में इस चेक बाधाओं के साथ पूरा किया जा सकता है, तथापि मैं अगर MySQL समान कुछ भी समर्थन करता है, पता नहीं है।

क्या किसी भी डेटाबेस पर काम करेंगे, यह है कि आप दो में विभाजित कर सकते हैं तालिका है। यदि रिकॉर्ड्स जहां सक्रिय = 0 इतिहास इतिहास हैं, और फिर कभी सक्रिय नहीं होंगे, तो आप उन्हें किसी अन्य तालिका में ले जा सकते हैं, और मूल तालिका पर एक साधारण अद्वितीय बाधा सेट कर सकते हैं।

+0

मुझे आईआरसी पर एक समान सुझाव मिला; एक सक्रिय टेबल और एक निष्क्रिय तालिका बनाएँ। लेकिन जिस तरह से आप इसे डालते हैं, वह अधिक समझ में आता है; एक ऐतिहासिक टेबल और एक सक्रिय टेबल है। हालांकि, इस तालिका में बहुत से फ़ील्ड हैं और ऐसा लगता है कि उन फ़ील्ड को दो तालिकाओं में डुप्लिकेट करना गलत काम होगा। आप कैसे सुझाव देंगे कि मैं इस तरह की अनावश्यकता से बचें? – Sam

+0

एक छोटा सा denormalization एक लंबा रास्ता तय कर सकते हैं, तो डुप्लिकेट परिभाषाओं के बारे में चिंता मत करो। बेशक, आपको मूल तालिका में भी ऐतिहासिक तालिका में कोई भी बदलाव करना होगा, इसलिए यह कुछ ओवरहेड है, लेकिन, IMHO यह स्वच्छ डेटा के लायक है। – SWeko

+0

हम्म, क्या होगा यदि मैं केवल उस डेटा को अलग करना चाहता हूं जिसके लिए अद्वितीय अनुक्रमण की आवश्यकता है? टेबल: mydata, mydata_active, mydata_inactive। इस प्रकार mydata में प्राथमिक कुंजी और डेटा कॉलम होते हैं।और, mydata_active और mydata_inactive में केवल वे कॉलम होंगे जिन्हें विशिष्ट रूप से अनुक्रमित किया जाना चाहिए और एक विदेशी कुंजी जो mydata का संदर्भ देती है। यह एक और तरीका है, लेकिन इसके लिए एक अतिरिक्त (तीसरी) तालिका की आवश्यकता है। – Sam

11

आप column_1, column_2 और सक्रिय, और पंक्तियों जहां विशिष्टता की आवश्यकता नहीं के लिए तो सेट सक्रिय = शून्य के साथ बहु-स्तंभ अद्वितीय सूचकांक बनाने की कोशिश कर सकते हैं। वैकल्पिक रूप से, आप ट्रिगर्स (see MySQL trigger syntax) का उपयोग कर सकते हैं और प्रत्येक प्रविष्टि/अपडेट की गई पंक्ति की जांच कर सकते हैं यदि ऐसे मान तालिका में पहले से हैं - लेकिन मुझे लगता है कि यह धीमा होगा।

+0

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

+0

नल समाधान में, डेटाबेस समान स्थिति में 2 पंक्तियों की विशिष्टता को कैसे अलग करता है? क्या MySQL उस समय बाधा जांच से बचता है? –

2

मैं दो स्तंभों के लिए एक अनूठा सूचकांक बाधा पैदा करने के लिए कोशिश कर रहा हूँ, लेकिन केवल जब एक और स्तंभ मान 1

आप एक अनूठा मूल्य के लिए "एक और स्तंभ" का मूल्य निर्धारित कर सकते हैं कि 1 के बराबर नहीं है उदाहरण के लिए एक रिकॉर्ड की आईडी।

तब अद्वितीय सूचकांक बाधा "एक और स्तंभ" सहित सभी तीन स्तंभों पर लागू किया जा सकता है। आइए "दूसरा कॉलम" कॉलमएक्स कॉल करें। यदि आप रिकॉर्ड में अनन्य बाधा लागू करना चाहते हैं तो कॉलमएक्स 1 के मान को सेट करें। यदि आप अद्वितीय बाधा लागू नहीं करना चाहते हैं तो कॉलमएक्स का मान एक अद्वितीय मान पर सेट करें।

तब कोई अतिरिक्त काम/ट्रिगर्स की आवश्यकता नहीं थी। सभी तीन स्तंभों के लिए अद्वितीय अनुक्रमणिका आपकी समस्या का समाधान कर सकती है।

संबंधित मुद्दे