2009-06-06 9 views
10

एसक्यूएल में, क्या यह लागू करने का कोई तरीका है कि स्तंभों के समूह से केवल एक कॉलम का मूल्य है, और अन्य शून्य हैं? शायद एक बाधा या ट्रिगर? इस प्रकार की चीज एक लुकअप टेबल के लिए हो सकती है, लेकिन क्या कोई वैकल्पिक टेबल डिज़ाइन है जो इसे बेहतर तरीके से पूरा कर सकता है?एसक्यूएल: कैसे लागू करें कि स्तंभों के समूह में केवल एक कॉलम सेट किया गया है

उदाहरण के लिए:

ID OtherTable1ID OtherTable2ID OtherTable3ID 
----------------------------------------------------- 
1  23    NULL    NULL 
2  NULL    45    NULL 
3  33    55    NULL -- NOT ALLOWED 

मुख्य मुद्दा यह है कि इन स्तंभों अन्य तालिकाओं के लिए सभी FKS हैं, तो मैं एक एकल स्तंभ के लिए उन्हें नीचे पतन नहीं कर सकते हैं।

मैं SQL सर्वर का उपयोग कर रहा हूं, लेकिन कोई भी जवाब करेगा।

+0

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

+0

एक लुकअप टेबल की तरह दिखता है। क्या इसका मूल अर्थ यह है कि यदि आप एक और एफके जोड़ते हैं तो आप इसमें एक और कॉलम जोड़ते हैं? –

+0

हाँ, यह मूल रूप से मेरे लिए एक लुकअप टेबल है। अगर मुझे एक और लुकअप पैरामीटर जोड़ने की ज़रूरत है, तो मुझे एक और एफके कॉलम जोड़ना होगा। क्या इसे हासिल करने के बेहतर तरीके हैं? –

उत्तर

13

@ tvanfosson के सुझाव की कमी तीन स्तंभों के लिए ठीक काम करते हैं, लेकिन व्यापकता के लिए मैं

(cast(col1 is not null, int) + 
cast(col2 is not null, int) + 
cast(col3 is not null, int)) = 1 

पसंद करते हैं क्योंकि यह "रैखिक बढ़ रही है" (के बजाय "quadratically बढ़ रही है") की राशि के साथ कॉलम के किसी भी संख्या के लिए बेहतर सामान्यीकरण करता कोडिंग (यह एसक्यूएल बोलियों में भी neater है कि int के लिए बुलियन उर्फ ​​बिट के स्पष्ट कास्टिंग की आवश्यकता नहीं है, लेकिन मुझे यकीन नहीं है कि SQL सर्वर उनमें से एक है)।

+4

SQL सर्वर के लिए, यह संभवतः बेहतर काम करेगा ... (केस कब col1 तब नहीं है जब 1 और 0 अंत + मामला जब col2 शून्य नहीं है तो 1 और 0 अंत <2) –

+1

@Glen Little: सिंटैक्स के साथ सहमत हैं लेकिन मुझे लगता है कि ओपी के मामले की तुलना अभी भी ' = 1'। –

6

एक बाधा के रूप में निम्नलिखित काम करना चाहिए:

(column1 is null and column2 is null) 
    or (column1 is null and column3 is null) 
    or (column2 is null and column3 is null) 

यह एक गैर-शून्य स्तंभ को रोकने के लिए यह मजबूर नहीं होगा लेकिन। जैसे कि आप उन चीजों के सेट के लिए एक स्तंभ का उपयोग करना चाहते हैं

column1 is not null 
    or column2 is not null 
    or column3 is not null 
0

यह मेरे लिए लग रहा है: कि एक और बाधा जोड़ने ऐसा करने के लिए। शायद आप कुछ प्रकार के टैग का उपयोग यह कहने के लिए कर सकते हैं कि यह Foo,3 या Bar,7 या Baz,9 है?

+0

के लिए धन्यवाद, मुझे अपने प्रश्न में यह स्पष्ट करना चाहिए था, लेकिन मुझे जिस मुद्दे का सामना करना पड़ रहा है वह यह है कि स्तंभ अन्य तालिकाओं में एफके हैं। मुझे अपना प्रश्न अपडेट करने दें, क्षमा करें –

+0

आह, अब यह दिलचस्प हो जाता है! मुझे इस पर थोड़ा सा विचार करने दो, लेकिन ऐसा लगता है कि यह मूल रूप से खराब आरडीबीएमएस कार्यान्वयन के साथ एक समस्या है। दुर्भाग्यवश, इस अर्थ में, मुझे नहीं लगता कि वहां एक अच्छा है ... –

+0

(स्पष्टीकरण के लिए, कोई कारण नहीं है कि आप कॉलम के प्रकार को घोषित करने में सक्षम नहीं होना चाहिए "या तो इसका संदर्भ , या उस के संदर्भ में, या दूसरे के संदर्भ में, "उन सभी पर पूर्ण एफके समर्थन के साथ, लेकिन वर्तमान डीबीएमएसएस इसके पास कहीं भी नहीं आते हैं।) –

1
CREATE TABLE Repro.Entity 
(
    entityId INTEGER IDENTITY (1, 1) NOT NULL, 
    column1 INTEGER, 
    column2 INTEGER, 
    column3 INTEGER, 
    CONSTRAINT Entity_PK PRIMARY KEY(entityId), 
    CONSTRAINT Entity_CK CHECK(
     (column1 IS NOT NULL AND column2 IS NULL AND column3 IS NULL) OR 
     (column1 IS NULL AND column2 IS NOT NULL AND column3 IS NULL) OR 
     (column1 IS NULL AND column2 IS NULL AND column3 IS NOT NULL)) 
) 
1

मेरे लिए यह एक खराब डिजाइन निर्णय की तरह दिखता है। चूंकि आईडी इस तालिका में प्राथमिक कुंजी है, इसलिए यह सभी विदेशी कुंजी संबंधों के लिए एक कानूनी मूल्य होगा। इसका मतलब यह है कि मूल्यों को स्वीकृत सीमा के भीतर हैं, यह गारंटी देने के लिए आपको फ्रंट एंड/बिजनेस लेयर में अतिरिक्त कड़ी मेहनत करनी है।

उदाहरण के लिए, टेबल सेट अप करने के तरीके के लिए, तालिका 2 के लिए यह बिल्कुल कानूनी है कि इसे 2 के बजाय लुकअप वैल्यू के रूप में 1 का उपयोग करने के लिए बिल्कुल उपयोग किया जाता है - और डेटाबेस इसे फंस नहीं देगा।

मैं शायद इस मार्ग पर नहीं जाऊंगा। मैं सिर्फ लुकअप नामक एक स्कीमा तैयार करूंगा और प्रति लुकअप वैल्यू एक लुकअप टेबल तैयार करूंगा। इस तरह डेटाबेस सभी बाधाओं को सही ढंग से लागू करेगा।

जिस तरह से आपने लुकअप टेबल सेट अप किया है, आप वर्तमान में पूर्णांक पूर्ण कुंजी तक सीमित हैं। कुछ मामलों में यह एक अच्छा विचार नहीं हो सकता है - उदाहरण के लिए आप देश के कोड/कोड को राज्य के लिए पूर्णांक मानों के बजाय स्टोर करना चाहते हैं।

+0

मैं भी नलिका कॉलम से बचना पसंद करता हूं लेकिन ओपी का डिज़ाइन (अनुरोध के रूप में काम कर रहे बाधा के अधीन) आपके पास एक लाभ है (मान लीजिए कि मैं सही ढंग से समझ गया हूं) कि वे वास्तव में एक गैर-पूर्ण मूल्य को लागू करने के लिए बाधा लिख ​​सकते हैं जबकि आपके पास ऐसी स्थिति हो सकती है जहां रेफरेंसिंग टेबल में शून्य पंक्तियां हो सकती हैं, जब तक कि आप ट्रिगर (या समान) का उपयोग करके अपनी 'वितरित विदेशी कुंजी' (Google ह्यूग डार्वेन) रोल न करें। – onedaywhen

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