के बीच एक SQL XOR प्रतिबंध जोड़ें, मैं एक तालिका में दो शून्य फीके के बीच एक बाधा परिभाषित करना चाहता हूं, जहां कोई शून्य है, तो दूसरे को एक मूल्य की आवश्यकता है, लेकिन दोनों शून्य नहीं हो सकते हैं और दोनों नहीं कर सकते मूल्य है तर्क यह है कि व्युत्पन्न तालिका को इसके प्रकार निर्धारित करने के लिए एफके तालिकाओं में से किसी एक से डेटा प्राप्त होता है। इसके अलावा, मजेदार बोनस अंक के लिए, क्या यह एक बुरा विचार है?दो शून्य के FK के
उत्तर
एक तरह से इसे प्राप्त करने के लिए बस को लिखने के लिए क्या "विशेष या" वास्तव में इसका मतलब है:
CHECK (
(FK1 IS NOT NULL AND FK2 IS NULL)
OR (FK1 IS NULL AND FK2 IS NOT NULL)
)
हालांकि, अगर आप कई FKS है, उपरोक्त विधि जल्दी से, बोझल बन सकता है जो मामले में आप कर सकते हैं कुछ इस तरह करते हैं:
CHECK (
1 = (
(CASE WHEN FK1 IS NULL THEN 0 ELSE 1 END)
+ (CASE WHEN FK2 IS NULL THEN 0 ELSE 1 END)
+ (CASE WHEN FK3 IS NULL THEN 0 ELSE 1 END)
+ (CASE WHEN FK4 IS NULL THEN 0 ELSE 1 END)
...
)
)
BTW, वहाँ उस पैटर्न के लिए वैध का उपयोग करता है, उदाहरण के this one के लिए (एमएस एसक्यूएल सर्वर के लिए लागू नहीं यद्यपि आस्थगित की कमी की कमी के कारण) कर रहे हैं। चाहे यह आपके विशेष मामले में वैध है, मैं अब तक प्रदान की गई जानकारी के आधार पर निर्णय नहीं ले सकता हूं।
सरल: 'जांच करें (एफके 1 आईएस नल! = एफके 2 आईएसएलएल है) ' –
@ स्टीफनजे। फुहरी दुख की बात है, एमएस एसक्यूएल सर्वर बुलीयन प्रकार को प्रथम श्रेणी के नागरिक के रूप में नहीं मानता है, ताकि वाक्यविन्यास स्वीकार नहीं किया जाएगा। –
लेकिन यह PostgreSQL में काम करता है, जो मुझे इसके लिए जरूरी है। लघु अभिव्यक्ति के लिए धन्यवाद, @ स्टीफनजे। फुहरी। बेशक, एक्सओआर होना बेहतर होगा। यह देखते हुए कि सिस्टम में कितनी चीजें ढीली हुई हैं जो एक अजीब चूक लगती है। – mARK
आप check constraint उपयोग कर सकते हैं:
create table #t (
a int,
b int);
alter table #t add constraint c1
check (coalesce(a, b) is not null and a*b is null);
insert into #t values (1,null);
insert into #t values (null ,null);
रनिंग:
The INSERT statement conflicted with the CHECK constraint "c1".
'coalesce (a, b) 'गैर-नल वापस लौटाएगा ** दोनों ** 'ए' और' बी' गैर-नल हैं और जांच पास हो जाएगी, जो इसे नहीं करना चाहिए (ओपी स्पष्ट था कि दोनों के पास मूल्य नहीं हो सकते हैं)। दूसरे शब्दों में, '#t मानों (1, 1) में डालें' विफल होना चाहिए। –
सुनिश्चित करें। धन्यवाद। मैं अपना जवाब ठीक कर दूंगा। – danihp
वैकल्पिक रास्ता एक प्रक्रिया में इस चेक बाधा परिभाषित करने के लिए है। व्युत्पन्न तालिका में एक रिकॉर्ड डालने से पहले, बाधा संतुष्ट होनी चाहिए। अन्य प्रविष्टि विफल रहता है या एक त्रुटि देता है।
- 1. MySQL FK तालिका
- 2. Postgres FK समग्र पी
- 3. Django सीमा ManytoMany चयनित FK
- 4. मैं कैसे दो शून्य
- 5. ऑल्टर तालिका डिफ़ॉल्ट मान और FK, कि मूल्य नहीं FK संदर्भ डाटा
- 6. दो बिटमैप छवियों के संयोजन में शून्य सूचक अपवाद
- 7. शून्य टेबल के साथ दो टेबल में शामिल हो?
- 8. शून्य के लिए दो ऑब्जेक्ट्स की तुलना करें
- 9. शून्य शून्य शून्य अनंत के बराबर है?
- 10. लिंक आदेश ऑर्डर नेविगेशन संपत्ति के साथ शून्य
- 11. शून्य क्वेरी वाले दो स्तंभों के मान जोड़ने के लिए SQL क्वेरी?
- 12. IntPtr.Zero शून्य के बराबर है?
- 13. शून्य से शून्य करने के लिए शून्य के साथ गलत क्या है?
- 14. mysql में शून्य डिफ़ॉल्ट शून्य और डिफ़ॉल्ट शून्य के बीच अंतर?
- 15. दो दो रिकॉर्ड के क्षेत्र OCaml
- 16. [NSString stringWithFormat:] के साथ नील स्ट्रिंग "(शून्य)"
- 17. दो बिगइंटर के दोहरे
- 18. ActiveRecord के दो एसोसिएशन
- 19. Regex दो अल्पविराम के
- 20. gacutil.exe के दो स्थान
- 21. शून्य के बिना सूची लिस्प
- 22. शून्य के साथ लिंक अभिव्यक्ति
- 23. तर्क के बिना शून्य फनक
- 24. सी #: शून्य के साथ तुलना
- 25. शून्य मानों के लिए डिफ़ॉल्ट
- 26. शून्य
- 27. जावा ऐप्स के लिए शून्य डाउनटाइम परिनियोजन
- 28. शून्य सूचक और शून्य सूचक के बीच क्या अंतर है?
- 29. स्थिर इनलाइन शून्य और शून्य के बीच क्या अंतर है?
- 30. शून्य == ऑब्जेक्ट और ऑब्जेक्ट के बीच अंतर == शून्य
[आप यहां दिखाए गए सुपर प्रकार/उप प्रकार के पैटर्न पर भी विचार कर सकते हैं] (http://stackoverflow.com/q/7771869/73226) –