2009-01-09 11 views
14

मैं एक रिश्ता बनाने की कोशिश कर रहा हूं जहां चार अलग-अलग हिस्सों में से कोई भी शामिल किया जा सकता है, लेकिन उसी भागों के किसी भी संग्रह को अद्वितीय के रूप में संभाला जाना चाहिए।MySQL प्रश्न - अनन्य कुंजी सही तरीके से काम नहीं कर रही है, या क्या मैं गलतफहमी कर रहा हूं?

उदाहरण: एक असाइनमेंट में एक असाइन की गई कंपनी होनी चाहिए, वैकल्पिक रूप से असाइन किया गया स्थान, कार्यसमूह और प्रोग्राम हो सकता है। किसी असाइनमेंट में किसी स्थान के बिना वर्कग्रुप नहीं हो सकता है।

मान लीजिए कि हमारे पास कंपनियां ए, बी, सी हैं; स्थान एक्स, वाई, जेड; कार्य समूहों आई, जे, कश्मीर और कार्यक्रमों 1, 2, 3

तो वैध संबंधों एक शामिल हो सकते हैं - एक्स - मैं - 1 A - Z - 2 बी - वाई सी सी - 3 बी - Z - कश्मीर

लेकिन अवैध संबंधों को शामिल किया जाएगा ए - कश्मीर (स्थान के बिना कार्यसमूह) Y - कश्मीर - 1 (कोई भी कंपनी)

तो, मेरी तालिका बनाने के लिए, मैं

बना लिया है 10

मैं इस अगर वहाँ एक कार्यसमूह (जो मैं खुशी से प्रोग्राम के या ट्रिगर्स के साथ, मुझे लगता है कि कर सकते हैं)

हालांकि एक स्थान के लिए एक काम के और neccessity के अलावा अपने सभी संबंधों को संभालने होगा आंकड़ा है, जब मैं परीक्षण यह स्कीमा, यह मुझे निम्नलिखित में प्रवेश करने की अनुमति देता है ...

INSERT INTO test VALUES (1, null, null, null), (1, null, null, null); 

... शिकायत के बिना। मुझे लगता है कि (1, शून्य, शून्य, शून्य) खुद के बराबर नहीं है क्योंकि नल शामिल हैं। यदि ऐसा है, तो क्या मैं इस संबंध को संभाल सकता हूं?

किसी भी मदद की सराहना की जाएगी!

उत्तर

17

यह एक फ़ीचर है (हालांकि मुझे उम्मीद नहीं थी)। - एक शून्य मूल्य, एक अपरिभाषित मूल्य है इसलिए दो शून्य मान ही नहीं हैं

यह एक विशेषता है:

This thread अपने प्रमुख व्यवहार पाने के लिए एक प्राथमिक कुंजी आप की उम्मीद कर रही है पता चलता है। थोड़ा भ्रमित हो सकता है लेकिन यह समझ में आता है कि आप इसके बारे में सोचते हैं।

एक अद्वितीय सूचकांक यह सुनिश्चित करता है कि गैर-नल मूल्य अद्वितीय हैं; आप निर्दिष्ट कर सकते हैं कि आपका कॉलम नल मान स्वीकार नहीं करता है।

+0

स्तंभों की स्थापना "शून्य नहीं" काम करेगा होना करने के लिए, लेकिन यह भी रोब की तरह डेटा वस्तुओं के अलावा की आवश्यकता होगी और मैं डेटाबेस सही ढंग से आवश्यकताओं सूचीबद्ध मिलान करने के लिए अनुमति देने के लिए सुझाव दिया है - अगर शून्य अनुमति नहीं है, तो आप एक की जरूरत है 'कोई फूड' मान जो खाद्य तालिका में एक वैध प्रविष्टि है एफके का संदर्भ है। –

+1

इंडेक्स को आपकी प्राथमिक कुंजी बनाने के बारे में: केवल समस्या यह है कि आप एक ऑटो-क्रिकेशन कॉलम नहीं बना सकते हैं जब तक यह प्राथमिक कुंजी का हिस्सा न हो। यही वह मुद्दा है जो मैं कर रहा हूं। –

+0

पीके के पूर्ण कॉलम भाग बनाने के साथ एक और समस्या यह है कि वे पूर्ण नहीं होते हैं और इसके बजाय आपको डिफ़ॉल्ट मान के रूप में 0 या खाली स्ट्रिंग मिलती है। – Rafa

3

एक ही रास्ता मैं अतिरिक्त चलाता बिना इस से निपटने के बारे में सोच सकते हैं/प्रोग्रामिंग संदर्भित तालिकाओं में से प्रत्येक में मान की एकल "उपरोक्त में से कोई" के लिए किया जाएगा, ताकि आपके परीक्षण

INSERT INTO test VALUES (1, NO_LOCATION, NO_WORKGROUP, NO_PROGRAM), 
         (1, NO_LOCATION, NO_WORKGROUP, NO_PROGRAM) 
कैसा लगेगा

जहां NO_* पहचानकर्ता आपके आईडी कॉलम के लिए सही प्रकार/लंबाई हैं। यह तब विफल हो जाएगा, जैसा कि आप इसकी अपेक्षा करेंगे।

0

MySQL NULL में! = NULL, या कुछ भी।तो यही वह काम है जो यूनिक काम नहीं करता है। आपको रिक्त स्थान के लिए एक और डिफ़ॉल्ट मान का उपयोग करना चाहिए, जैसे शून्य

0

मुझे लगता है कि यह ध्यान रखना महत्वपूर्ण है कि नल मानों का व्याख्या करने और संभालने के लिए एक उचित तरीका है, और ओपी द्वारा प्रदर्शित व्यवहार बिल्कुल वही है। आप उस व्यवहार को नजरअंदाज कर सकते हैं, और आप किसी भी तरह से आपत्ति के बिना अपनी क्वेरी को संभाल सकते हैं, लेकिन गैर-मानक व्यक्तिगत वरीयता के बजाए, सर्वोत्तम प्रथाओं के कुछ रूपों का वर्णन करने वाले किसी उत्तर को "स्वीकार" करना अच्छा हो सकता है।

या यदि आप सर्वसम्मति से सर्वोत्तम अभ्यास से सहमत नहीं हैं, तो आप किसी भी उत्तर को स्वीकार नहीं कर सकते हैं।

यह जितनी जल्दी हो सके उत्तर को स्वीकार करने की दौड़ नहीं है। मुझे लगता है कि विचार-विमर्श और सहयोग का उद्देश्य भी प्रक्रिया का हिस्सा बनना है।

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