2010-09-27 13 views
5

"प्रति तालिका केवल एक पहचान कॉलम हो सकता है" - क्यों?

"वहाँ केवल तालिका के अनुसार एक पहचान स्तंभ हो सकता है" यह इतना क्यों है? वाहन का परिदृश्य लें, वहां एक चासिस संख्या मौजूद है जो अद्वितीय है और पंजीकरण संख्या जो अद्वितीय साबित होती है। एसक्यूएल सर्वर में इस परिदृश्य को चित्रित करने के लिए हमें कॉलम के लिए एक कस्टम कार्यान्वयन की आवश्यकता है। इसके विपरीत, ओरेकल आपके पास एक टेबल पर जितने चाहें उतने अनुक्रम हो सकते हैं। पहचान कॉलम पर कोई प्रतिबंध क्यों है, किसी भी विशिष्ट कारण?

वाहन स्कीमा रखने का परिदृश्य कुछ काल्पनिक है कि मैं खुद को पूछताछ कर रहा हूं कि पहचान कॉलम पर प्रतिबंध क्यों है।

+1

क्या इससे वाकई कोई फर्क पड़ता है? –

+0

मैं जानना चाहता हूं कि यह क्यों संभव नहीं है। – Chaitanya

+2

क्योंकि SQL सर्वर टीम के इंजीनियरों या तो ऐसा नहीं कर सके, या नहीं सोचा था कि ऐसा करना एक अच्छा विचार था। –

उत्तर

8

SQL सर्वर में एक पहचान कॉलम में बीज और एक ऑटो वृद्धि है। हम हमेशा गणना कर सकते हैं कि दूसरा hypothetical आईडी मान क्या होना चाहिए यदि हम पहले आईडी कॉलम के मूल्य को जानते थे।

उदा। यदि यह कानूनी वाक्यविन्यास

create table #foo 
(
bar int identity(1,10), 
baz int identity(1000,1) 
) 

हमें बाज़ को स्टोर करने की आवश्यकता नहीं होगी क्योंकि इसे बार से गणना की जा सकती है।

baz = 1000 + (bar-1)/10 
+1

जो मैं कहने की कोशिश कर रहा था उसे व्यक्त करने के लिए आपको डरता हूं! – DForck42

2

डेटा डेटाबेस में संग्रहीत है, IDENTITY कॉलम द्वारा की गई। एक ऐसा कॉलम फाइल सिस्टम जैसे भंडारण की अनुमति देता है। एकाधिक IDENTITY कॉलम होने से समस्या भ्रमित हो जाएगी।

मेरी सिफारिश है कि आप अपने कॉलम में से एक को IDENTITY या PRIMARY KEY, और दूसरे के लिए UNIQUE KEY बनें। एक उपयोगकर्ता के रूप में कोई फर्क नहीं पड़ता है, लेकिन यह डीबीएमएस को खुश कर देगा।

5

क्योंकि यह वही मूल्य होगा।

1  100 
2  102 
3  104 
4  106 
5  108 
6  110 
7  112 
8  114 
9  116 
10 118 

आप ऐसा करके दूसरे स्तंभ मिल सकता है: यदि आप प्राथमिक के रूप में पहचान (1,1), और पहचान (100,2) था, तो आप ये परिणाम प्राप्त होगा

((आईडी -1) * 2) +100

यह एक रैखिक समीकरण है, तो शो के अलावा अन्य बिंदु क्या होगा?

+0

मेरे विचार बिल्कुल। – ErikE

+0

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

+1

@dportas, निश्चित रूप से, लेकिन सिद्धांत रूप में, यदि आपके पास 2 पहचान थी, तो वे दोनों एक ही समय में आवंटित किए जाएंगे, फिर भी आपको वही प्रभाव देंगे। – DForck42

1
  • ओरेकल अनुक्रम SQL सर्वर पहचान कॉलम नहीं हैं: आप उनके लिए कुछ कोड लिखते हैं। वे CREATE TABLE DDL
  • किसी भी बाद पहचान कॉलम पहले एक से बाहर काम किया जा सकता है के आधार पर बॉक्स से बाहर काम नहीं है (संपादित करें: अन्य लोक उल्लेख किया)
0

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

1

एमएसडीएन में कारण बताया नहीं गया है कि मुझे मिल सकता है।हालांकि, मुझे संदेह है कि एसक्यूएल सर्वर पहचान कॉलम लागू करने के तरीके के साथ ऐसा करना है। संकल्पनात्मक रूप से, मुझे लगता है कि कॉलम स्तर की तुलना में तालिका स्तर पर यह सेटिंग या मूल्य अधिक है और कॉलम मूल्य तक पहुंचने का एक तरीका है। मुझे ऐसा लगता है क्योंकि पहचान मानों के साथ बातचीत करने के सभी तरीकों में तालिका पैरामीटर के रूप में होती है, न कि कॉलम उदा। IDENT_SEED, IDENT_CURRENT, और IDENT_INCR। यदि यह कॉलम स्तर सेटिंग था, तो पैरामीटर में कॉलम नाम शामिल होगा। यदि आपके पास तालिका में एक से अधिक पहचान कॉलम थे, तो वे कार्य काम नहीं करेंगे।

मैं बस अनुमान लगा रहा हूं।

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