2009-08-20 40 views
31

मुझे किसी ने एक साक्षात्कार पर इस प्रश्न पूछा ...प्राथमिक कुंजी और अद्वितीय बाधा के बीच क्या अंतर है?

+6

और तुम थे का उपयोग कर इन दो तालिकाओं के बीच diffrence है इसका जवाब देने में सक्षम नहीं है? असफल व्यक्ति! न ही मैं। –

+0

[अनन्य और प्राथमिक कुंजी] के संभावित डुप्लिकेट (http://stackoverflow.com/questions/2452399/unique-and-primary-key) – Vijay

उत्तर

20

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

एक अनूठी बाधा का मतलब है कि एक विशेष क्षेत्र अद्वितीय होना चाहिए।

+9

पंक्ति की प्राथमिक कुंजी वह तरीका है जिस पर डेटाबेस एक व्यक्तिगत पंक्ति को पहचानता है। इसमें एक या अधिक स्तंभ शामिल हो सकते हैं, जो एक साथ अद्वितीय भी होना चाहिए। – TheJacobTaylor

+11

प्राथमिक कुंजी फ़ील्ड का एक सेट है, जरूरी नहीं कि एक फ़ील्ड। –

+11

अद्वितीय बाधाएं फ़ील्ड के संयोजनों पर भी लागू हो सकती हैं। – chaos

4

प्रत्येक प्राथमिक कुंजी एक अद्वितीय बाधा है, लेकिन पीके के अलावा, एक तालिका में अतिरिक्त अनूठी बाधाएं हो सकती हैं।

कहें कि आपके पास एक टेबल कर्मचारी, पीके कर्मचारी है। उदाहरण के लिए, आप एसएसएन पर एक अनूठी बाधा जोड़ सकते हैं।

1

प्राथमिक कुंजी कॉलम का एक न्यूनतम सेट है, जैसे कि उन स्तंभों में समान मान वाले किसी भी दो रिकॉर्ड में सभी कॉलम में समान मान हैं। ध्यान दें कि एक प्राथमिक कुंजी में कई कॉलम हो सकते हैं।

एक विशिष्टता बाधा बिल्कुल वैसा ही है जैसा यह लगता है।

+1

@ आपके शब्द से यह एक विशिष्टता बाधा की तरह ध्वनि बनाता है केवल एक ही कॉलम पर लागू हो सकता है, जो सत्य नहीं है। – Kip

3

एंड्रयू के उत्तर के अतिरिक्त, आपके पास प्रति तालिका केवल एक प्राथमिक कुंजी हो सकती है लेकिन आपके पास कई अनूठी बाधाएं हो सकती हैं।

+0

आपके पास कई प्राथमिक कुंजी हो सकती हैं, इसे एक समग्र कुंजी कहा जाता है। – JMP

+10

तकनीकी रूप से आपके पास एकाधिक फ़ील्ड से बना प्राथमिक कुंजी हो सकती है, लेकिन आप अभी भी केवल एक समग्र प्राथमिक कुंजी रख सकते हैं। – MattC

2
  1. प्राथमिक कुंजी का उद्देश्य तालिका में एक पंक्ति को विशिष्ट रूप से पहचानना है। अद्वितीय बाधा सुनिश्चित करता है कि तालिका में पंक्तियों के बीच एक फ़ील्ड का मान अद्वितीय है।
  2. आपके पास प्रति तालिका केवल एक प्राथमिक कुंजी हो सकती है। आप प्रति टेबल एक से अधिक अनूठी बाधा हो सकती है।
48

प्राथमिक कुंजी शून्य नहीं हो सकती है। अद्वितीय कुंजी कर सकते हैं।

+6

+1 यह महत्वपूर्ण अंतर है। इसका मतलब है कि प्राथमिक कुंजी में कॉलम प्रत्येक पंक्ति को अनजाने में संबोधित कर सकते हैं, लेकिन कॉलम अद्वितीय कुंजी नहीं कर सकती (जब तक कि वे संयोग से नहीं होते हैं)। –

+0

इस प्रश्न को पढ़ना (http://stackoverflow.com/questions/767657/how-do-i-create-unique-constraint-that-also-allows-nulls-in-sql-server), और उत्तर, ऐसा लगता है अद्वितीय बाधा की तरह नल नहीं हो सकता है। तो, मैं उलझन में हूँ। क्या यह एमएसएसएलएल विशिष्ट है, या क्या? –

0

प्राथमिक कुंजी शून्य नहीं हो सकती है लेकिन अद्वितीय बाधा शून्य है। जब आप अपनी तालिका के लिए प्राथमिक कुंजी चुनते हैं तो यह उस क्षेत्र में स्वचालित रूप से इंडेक्स है।

0

प्राथमिक कुंजी अनिवार्य रूप से संयोजन (अद्वितीय + शून्य नहीं) के संयोजन हैं। जब भी एक विदेशी कुंजी का संदर्भ दिया जाता है तो rdbms को प्राथमिक कुंजी की आवश्यकता होती है।

अद्वितीय कुंजी सिर्फ कॉलम की विशिष्टता को लागू करती है। यूनिक कुंजी के मामले में फ़ील्ड का मान शून्य हो सकता है। इसके अलावा इसका उपयोग विदेशी कुंजी को संदर्भित करने के लिए भी नहीं किया जा सकता है, यह काफी स्पष्ट है क्योंकि इसमें शून्य मूल्य हो सकते हैं

+1

नहीं, एक विदेशी कुंजी भी एक अद्वितीय बाधा में कॉलम का संदर्भ दे सकती है। –

0

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

मैं एक SQL सर्वर उपयोगकर्ता हूं, इसलिए प्राथमिक कुंजी का मेरे लिए एक अधिक विशिष्ट अर्थ है। SQL सर्वर में, डिफ़ॉल्ट रूप से, प्राथमिक कुंजी "क्लस्टर इंडेक्स" कहलाती है। क्लस्टर्ड इंडेक्स उस विशेष तालिका के लिए डेटा पृष्ठों के वास्तविक क्रम को परिभाषित करता है, जिसका अर्थ है कि प्राथमिक कुंजी ऑर्डर डिस्क पर पंक्तियों के भौतिक क्रम से मेल खाता है।

मुझे पता है कि माइस्क्ल के तालिका प्रारूपों में से एक, संभवतः अधिक क्लस्टर्ड इंडेक्सिंग का भी समर्थन करता है, जिसका मतलब SQL सर्वर में समान होता है ... यह डिस्क पर भौतिक पंक्ति क्रम को परिभाषित करता है।

ओरेकल इंडेक्स संगठित टेबल्स नामक कुछ प्रदान करता है, जो प्राथमिक कुंजी द्वारा डिस्क पर पंक्तियों को ऑर्डर करता है।

मैं डीबी 2 से बहुत परिचित नहीं हूं, हालांकि मुझे लगता है कि क्लस्टर्ड इंडेक्स का मतलब है डिस्क पर पंक्तियों को एक अलग इंडेक्स के रूप में उसी क्रम में संग्रहीत किया जाता है। मुझे नहीं पता कि क्लस्टर्ड इंडेक्स प्राथमिक कुंजी से मेल खाना चाहिए, या यदि यह एक अलग इंडेक्स हो सकता है।

+0

ओरेकल में इंडेक्स संगठित टेबल्स हैं, जो SQL सर्वर क्लस्टर इंडेक्स की तरह हैं, सिवाय इसके कि ऑर्डरिंग प्राथमिक कुंजी पर है, जहां SQL सर्वर के पास कुछ अन्य इंडेक्स पर क्लस्टर इंडेक्स है। –

+0

@ शैनन: अंतर्दृष्टि के लिए धन्यवाद। मैंने अपना जवाब अपडेट कर लिया है। – jrista

+0

@Shannon: SQL सर्वर में, क्लस्टरर्ड इंडेक्स डिस्क पर भौतिक पृष्ठों का सेट है, जैसे ओरेकल इंडेक्स-संगठित तालिका की तरह। क्लस्टर्ड इंडेक्स के लिए कोई अलग इंडेक्स नहीं है ... हालांकि SQL सर्वर में क्लस्टर्ड इंडेक्स प्राथमिक कुंजी इंडेक्स नहीं होना चाहिए। डिफ़ॉल्ट रूप से प्राथमिक कुंजी पर क्लस्टर करने के लिए टेबल्स बनाए जाते हैं, लेकिन प्राथमिक कुंजी द्वारा क्लस्टर होने के लिए प्रतिबंधित नहीं हैं। – jrista

0

दोनों अन्य उत्तरों में उल्लिखित नल के अपवाद के साथ तालिका में पंक्तियों में विशिष्टता की गारंटी देते हैं।

इसके अतिरिक्त, प्राथमिक कुंजी "इंडेक्स" के साथ आता है, जो या तो क्लस्टर या गैर-क्लस्टर हो सकता है।

+0

कई आरडीबीएमएस स्वचालित रूप से अद्वितीय बाधाओं के लिए अनुक्रमणिका बनाते हैं। (मुझे ऐसा कोई नहीं पता जो नहीं है।) –

12
  1. प्राथमिक कुंजी शून्य नहीं हो सकती है लेकिन अद्वितीय केवल एक शून्य मान हो सकता है।
  2. प्राथमिक कुंजी स्वचालित रूप से क्लस्टर अनुक्रमणिका बनाते हैं लेकिन अद्वितीय कुंजी नहीं।
  3. एक तालिका में केवल एक प्राथमिक कुंजी हो सकती है लेकिन अनन्य कुंजी एक से अधिक हो सकती है।
+1

+1 अच्छा जवाब। ध्यान दें कि आपका पहला बिंदु SQL सर्वर पर लागू होता है, लेकिन उदाहरण के लिए, MySQL पर नहीं। –

+0

आपका पहला बिंदु सभी मामलों में सही नहीं है। –

+1

आपका पहला बिंदु SQL मानक के संबंध में सही नहीं है और दूसरा SQL मानक के संबंध में अप्रासंगिक है (लेकिन दोनों SQL सर्वर के सत्य हैं)। – onedaywhen

0

यहां उत्तरों की एक बड़ी संख्या ने पीके बनाम अद्वितीय बाधाओं के गुणों पर चर्चा की है। लेकिन अवधारणा में अंतर को समझना अधिक महत्वपूर्ण है।

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

एक अद्वितीय बाधा आपके डेटाबेस स्कीमा में डोमेन विशिष्ट व्यावसायिक नियमों को लागू करने का एक तरीका है।

एक पीके बन गया यह रिकॉर्ड के लिए पहचानकर्ता है, आप प्राथमिक कुंजी के मूल्य को कभी भी नहीं बदल सकते हैं।

+2

+1 इस पहलू को भी देखना अच्छा है। हालांकि आपकी आखिरी वाक्य बिल्कुल सही नहीं है: 'एक पीके बनें यह रिकॉर्ड के लिए पहचानकर्ता है, आप प्राथमिक कुंजी के मूल्य को कभी भी नहीं बदल सकते हैं।' शायद आपको * प्राथमिक कुंजी नहीं बदलनी चाहिए, लेकिन आप * कर सकते हैं * कर दो। –

+0

-1 "सामान्य परिस्थितियों में एक प्राथमिक कुंजी को कभी भी ऐसे मान नहीं मिलते हैं जिनके पास आपके डोमेन में कोई भोजन हो रहा है" - तथ्य के रूप में प्रस्तुत स्वाद का मामला। – onedaywhen

4

अद्वितीय कुंजी की कमी:

  1. अद्वितीय कुंजी बाधा आप एक बाधा की तरह स्तंभ मान विशिष्टता प्राप्त करना चाहिए प्रदान करेगा।
  2. यह डिफ़ॉल्ट रूप से गैर-क्लस्टर सूचकांक बना देगा
  3. किसी भी तालिका में अद्वितीय बाधाओं को जोड़ा जा सकता है।
  4. यह कॉलम में शून्य मान की अनुमति देगा।

    ALTER तालिका TABLE_NAME जोड़ें बाधा UNIQUE_CONSTRAINT अद्वितीय (column_name1, column_name2, ...)

प्राथमिक कुंजी:

  1. प्राथमिक कुंजी तालिका में कॉलम डेटा विशिष्टता पैदा करेगा ।
  2. प्राथमिक कुंजी डिफ़ॉल्ट
  3. केवल एक Primay कुंजी एक मेज के लिए बनाया जा सकता है के द्वारा संकुल अनुक्रमणिका पैदा करेगा
  4. एकाधिक स्तंभों के रूप में एक भी प्राथमिक कुंजी
  5. यह अभ्यस्त शून्य मान की अनुमति देने के समेकित किया जा सकता है।

    ALTER तालिका TABLE_NAME जोड़ें बाधा KEY_CONSTRAINT प्राथमिक कुंजी (स्तंभ)

+0

प्राथमिक कुंजी बिंदु 4: एक 'अद्वितीय' बाधा या तो एक साधारण कुंजी या एक यौगिक कुंजी (सरल = एक कॉलम, यौगिक = एकाधिक कॉलम) हो सकती है यानी इस संबंध में 'प्राथमिक कुंजी' से अलग नहीं है। – onedaywhen

5

टी एल; डॉ बहुत PRIMARY KEY (विशिष्टता, संदर्भ करने योग्य गैर-शून्य सत्ता, क्लस्टरिंग, आदि) से गर्भित किया जा सकता है लेकिन कुछ भी नहीं जिसे स्पष्ट रूप से UNIQUE का उपयोग नहीं किया जा सकता है।

मेरा सुझाव है कि यदि आप ऐसे कोडर हैं जो SELECT * FROM... की सुविधा पसंद करते हैं तो उन सभी अश्लील कॉलम को सूचीबद्ध किए बिना PRIMARY KEY केवल आपके लिए चीज है।


एक relvar कई कुंजी हो सकता है, लेकिन हम को रेखांकित करने के लिए सिर्फ एक को चुनें और फोन है कि एक प्राथमिक कुंजी। पसंद मनमाने ढंग से है, इसलिए प्राथमिक की अवधारणा तार्किक बिंदु दृश्य से वास्तव में बहुत महत्वपूर्ण नहीं है। हालांकि, कुंजी की सामान्य अवधारणा बहुत महत्वपूर्ण है! शब्द उम्मीदवार कुंजी का अर्थ कुंजी के समान है (यानी, उम्मीदवार के को उम्मीदवार का कोई वास्तविक महत्व नहीं है- यह टेड कोड द्वारा प्रस्तावित किया गया था क्योंकि उन्होंने प्रत्येक कुंजी को प्राथमिक कुंजी के रूप में मनोनीत होने के लिए उम्मीदवार के रूप में माना था) .. एसक्यूएल तालिका के कॉलम का सबसेट उस तालिका के लिए कुंजी के रूप में घोषित करने की अनुमति देता है। यह उनमें से एक को प्राथमिक कुंजी के रूप में मनोनीत होने की अनुमति भी देता है। अन्य की कमी के सिलसिले कि आवश्यकता हो सकती है में सुविधा की एक निश्चित राशि के लिए बनाता है एक कुंजी निर्दिष्ट प्राथमिक होने के लिए

What Is a Key? by Hugh Darwen


यह सामान्य है ... एक प्रमुख खास तौर को प्राथमिक कुंजी के रूप में (और किसी अन्य प्रश्न में रिवर के लिए कुंजी को वैकल्पिक कुंजी कहा जाता है)। लेकिन क्या कुछ कुंजी प्राथमिक के रूप में चुनी जानी है, और यदि ऐसा है, तो संबंधपरक मॉडल के दायरे से परे, मनोवैज्ञानिक समस्याएं हैं। अच्छी प्रैक्टिस के मामले में, अधिकांश बेस रिवर्स में शायद प्राथमिक कुंजी होनी चाहिए- लेकिन, दोहराने के लिए, इस नियम, यदि यह नियम है, तो वास्तव में इस तरह के एक रिलेशनशिप समस्या नहीं है ... मजबूत अनुशंसा [से एसक्यूएल उपयोगकर्ता]: बेस टेबल के लिए, किसी भी दर पर, प्राथमिक कुंजी और/या अद्वितीय विनिर्देशों का उपयोग यह सुनिश्चित करने के लिए करें कि प्रत्येक तालिका में कम से कम एक कुंजी हो।

SQL and Relational Theory: How to Write Accurate SQL Code तक सी.जे. दिनांक

मानक SQL PRIMARY KEY

  • में विशिष्टता का तात्पर्य है, लेकिन आप स्पष्ट रूप से (UNIQUE का प्रयोग करके) निर्दिष्ट कर सकते हैं।
  • NOT NULL तात्पर्य लेकिन आप कि स्पष्ट रूप से निर्दिष्ट कर सकते हैं जब कॉलम बनाने (लेकिन आप nulls किसी भी तरह से परहेज किया जाना चाहिए!)
  • आप एक FOREIGN KEY में अपनी कॉलम छोड़ करने की अनुमति देता है, लेकिन आप उन्हें स्पष्ट रूप से निर्दिष्ट कर सकते हैं।
  • प्रति तालिका केवल एक कुंजी के लिए घोषित किया जा सकता है लेकिन यह स्पष्ट नहीं है कि क्यों (मूल रूप से अवधारणा का प्रस्ताव करने वाले कोडड ने इस तरह के प्रतिबंध को लागू नहीं किया)।

कुछ उत्पादों PRIMARY KEY में मेज के संकुल अनुक्रमणिका का तात्पर्य है, लेकिन आप स्पष्ट रूप से निर्दिष्ट कर सकते हैं (आप प्राथमिक कुंजी क्लस्टर सूचकांक होने के लिए नहीं चाहते हो सकता है!)

कुछ लोगों PRIMARY KEY विशुद्ध रूप से मनोवैज्ञानिक महत्व है के लिए:

  • उन्हें लगता है कि यह इंगित करता है कि कुंजी को विदेशी कुंजी में संदर्भित किया जाएगा (यह कोडड द्वारा प्रस्तावित किया गया था लेकिन वास्तव में मानक एसक्यूएल और एसक्यूएल विक्रेताओं द्वारा अपनाया नहीं गया था)।
  • उन्हें लगता है कि यह तालिका की एकमात्र कुंजी को इंगित करता है (लेकिन अन्य उम्मीदवार कुंजी को लागू करने में विफलता डेटा अखंडता के नुकसान की ओर ले जाती है)।
  • उन्हें लगता है कि यह व्यवसाय के लिए कोई महत्व नहीं होने पर 'सरोगेट' या 'कृत्रिम' कुंजी का तात्पर्य है (लेकिन वास्तव में उपयोगकर्ताओं के संपर्क में उद्यम पर अवांछित महत्व लगाता है)।
+0

यदि आप न्यूल के रूप में निश्चित नहीं हैं, तो आप UNIQUE कॉलम में 1 न्यूल मान प्राप्त कर सकते हैं, लेकिन आप प्राथमिक कुंजी कॉलम में कोई भी नलिका प्राप्त कर सकते हैं –

1

अद्वितीय बाधा डेटाबेस तालिका में प्रत्येक रिकॉर्ड को विशिष्ट रूप से पहचानती है।

अद्वितीय और प्राथमिक कुंजी बाधाएं कॉलम या स्तंभों के सेट के लिए विशिष्टता की गारंटी प्रदान करती हैं।

एक प्राथमिक कुंजी बाधा स्वचालित रूप से उस पर परिभाषित एक विशिष्ट बाधा है।

नोट आप तालिका के अनुसार कई अद्वितीय की कमी हो सकती है, लेकिन तालिका

0
create table a1 (id int,name varchar(20),city varchar(20),state varchar(20),country varchar(28) constraint pk_a1 primary key(id)); 
insert into a1 values(101,'sohan','gkp','up','india'); 


create table a1 (id int primary key,name varchar(20),city varchar(20),state varchar(20),country varchar(28)); 
insert into a1 values(101,'sohan','gkp','up','india'); 

में केवल एक प्राथमिक कुंजी बाधा क्या प्राथमिक कुंजी और बाधाओं का उपयोग कर

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