दिलचस्प पोस्ट
WPF सत्यापन त्रुटियों का पता लगा रहा है AccessType.FIELD, AccessType.PROPERTY और @Access का उद्देश्य क्या है जेडब्ल्यूटी (जेएसओएन वेब टोकन) समाप्ति की स्वचालित लंबी अवधि एक रीसेट एपीआई में कई-से-कई रिश्तों को कैसे संभालना है? वितरण, दुर्गों, सेटअपटोल्टों और डिस्टुट 2 के बीच मतभेद? जावास्क्रिप्ट में दो स्ट्रिंग्स के बीच स्ट्रिंग पाने के लिए नियमित अभिव्यक्ति iVar संपत्ति, स्वयं के माध्यम से पहुंच? मैं HTML <select> dropdown में दृश्यमान विकल्पों को कैसे सीमित कर सकता हूं? SQL डाटाबेस में प्राथमिक कुंजी के रूप में स्ट्रिंग्स पता लगाएं कि जावा क्लास को कहाँ से लोड किया गया है जावा 7 प्रयास-के-साथ संसाधन विवरण लाभ मठ अभिव्यक्ति पार्स सी # एक enum के माध्यम से बदलना? (इंडेक्सिंग सिस्टम। अर्रे) अग्रवाल सूचकांक कैसे खोजें क्या एक सीएसएस नियम को दूसरे के भीतर संदर्भ करना संभव है?

क्या मेरे पास एक मेज पर एकाधिक प्राथमिक कुंजी हो सकती है?

क्या मेरे पास एक मेज पर एकाधिक प्राथमिक कुंजी हो सकती है?

वेब के समाधान से एकत्रित समाधान "क्या मेरे पास एक मेज पर एकाधिक प्राथमिक कुंजी हो सकती है?"

एक तालिका में एक समग्र प्राथमिक कुंजी हो सकती है जो एक प्राथमिक कुंजी है जिसे दो या अधिक स्तंभों से बनाया गया है। उदाहरण के लिए:

CREATE TABLE userdata ( userid INT, userdataid INT, info char(200), primary key (userid, userdataid) ); 

अद्यतन: यहां समग्र प्राथमिक कुंजी के अधिक विस्तृत वर्णन के साथ एक लिंक है ।

आपके पास केवल एक प्राथमिक कुंजी है, लेकिन आप अपने प्राथमिक कुंजी में एकाधिक कॉलम कर सकते हैं।

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

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

उम्मीदवार कुंजी रिलेशनल डेटा मॉडल में एक मौलिक अवधारणा है।

प्राथमिक कुंजी के रूप में उम्मीदवार कुंजी में से एक को निर्दिष्ट करने के लिए, एक तालिका में कई चाबियाँ मौजूद हैं, तो यह सामान्य अभ्यास है किसी भी अन्य उम्मीदवार की बजाय प्राथमिक कुंजी का संदर्भ देने के लिए तालिका में किसी भी विदेशी कुंजी का कारण होने के लिए यह सामान्य अभ्यास भी है

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

यह मुख्य प्रश्न और @ कलमी के दोनों प्रश्नों के लिए इसका जवाब है

कई ऑटो-जनरेटिंग कॉलम होने का क्या मतलब होगा?

इस कोड के नीचे एक समग्र प्राथमिक कुंजी है इसके स्तंभों में से एक स्वतः-वृद्धिशील है। यह केवल MyISAM में ही काम करेगा InnoDB एक त्रुटि उत्पन्न करेगा " त्रुटि 1075 (42000): गलत तालिका परिभाषा; केवल एक ही ऑटो कॉलम हो सकता है और इसे एक कुंजी के रूप में परिभाषित किया जाना चाहिए "।

 DROP TABLE IF EXISTS `test`.`animals`; CREATE TABLE `test`.`animals` ( `grp` char(30) NOT NULL, `id` mediumint(9) NOT NULL AUTO_INCREMENT, `name` char(30) NOT NULL, PRIMARY KEY (`grp`,`id`) ) ENGINE=MyISAM; INSERT INTO animals (grp,name) VALUES ('mammal','dog'),('mammal','cat'), ('bird','penguin'),('fish','lax'),('mammal','whale'), ('bird','ostrich'); SELECT * FROM animals ORDER BY grp,id; Which returns: +--------+----+---------+ | grp | id | name | +--------+----+---------+ | fish | 1 | lax | | mammal | 1 | dog | | mammal | 2 | cat | | mammal | 3 | whale | | bird | 1 | penguin | | bird | 2 | ostrich | +--------+----+---------+ 

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

यह महत्वपूर्ण है कि प्रत्येक इकाई के लिए लॉजिकल मॉडल में कम से कम "व्यापार विशेषताओं" का एक समूह होता है जिसमें इकाई के लिए एक कुंजी शामिल होती है। बॉइस, कॉड, डेट एट अल, इन रिलेशनशिप मॉडल में उम्मीदवार कुंजी के रूप में देखें। जब हम इन इकाइयों के लिए तालिकाओं का निर्माण करते हैं, तो उनकी उम्मीदवार कुंजी उन तालिकाओं में प्राकृतिक कुंजियां बन जाती हैं। यह केवल उन प्राकृतिक कुलों के माध्यम से है, जो उपयोगकर्ता टेबल में पंक्तियों की अनन्य पहचान कर सकते हैं; चूंकि सरोगेट कुंजी हमेशा उपयोगकर्ताओं से छिपी रहती है। इसका कारण यह है कि सरोगेट कुंजी का कोई व्यावसायिक अर्थ नहीं है।

हालांकि हमारे तालिकाओं के लिए भौतिक मॉडल कई उदाहरणों में एक किराए की कुंजी के बिना अक्षम हो सकते हैं। याद रखें कि एक गैर-क्लस्टर इंडेक्स के लिए गैर-कवर किए गए कॉलम केवल क्लस्टर किए गए इंडेक्स (एक पल के लिए ढेर के रूप में लागू की गई उपेक्षा की तालिकाओं) में एक प्रमुख लुकअप के माध्यम से (सामान्य रूप से) पाया जा सकता है। जब हमारी उपलब्ध प्राकृतिक कुंजी विस्तृत होती है तो (1) हमारे गैर-क्लस्टर वाले पत्ते के नोड्स की चौड़ाई को चौड़ा करती है, भंडारण आवश्यकताओं को बढ़ाना और उस गैर-क्लस्टर वाले सूचकांक की तलाश और स्कैन के लिए अभिगम को पढ़ें; और (2) सूचकांक ऊंचाई और सूचकांक आकार को बढ़ाते हुए हमारे क्लस्टर वाले इंडेक्स से फैन-आउट कम कर देता है, फिर हमारे क्लस्टर अनुक्रमित के लिए पढ़ता और भंडारण की आवश्यकता बढ़ती है; और (3) हमारे क्लस्टर किए गए इंडेक्स के लिए कैश आवश्यकताओं को बढ़ाता है कैश के अन्य अनुक्रमित और डेटा का पीछा करते हुए।

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

ध्यान दें कि ये लाभ केवल तब ही होते हैं जब सरोगेट कुंजी दोनों छोटी और क्लस्टरिंग कुंजी होती है यदि GUID को क्लस्टरिंग कुंजी के रूप में प्रयोग किया जाता है तो स्थिति अक्सर खराब हो सकती है अगर छोटी उपलब्ध प्राकृतिक कुंजी का उपयोग किया गया था। अगर तालिका को ढेर के रूप में व्यवस्थित किया जाता है तो 8-बाइट (हेप) राउड कुंजी देखने के लिए उपयोग किया जाएगा, जो कि 16-बाइट GUID से बेहतर है, लेकिन 4-बाइट पूर्णांक से कम प्रदर्शनकर्ता

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

अगर ढेर के परिणाम (हैश शायद शामिल हो) तो यह माना जाता है कि वरीय भंडारण तो एक व्यापक क्लस्टरिंग की लागत को व्यापार-बंद विश्लेषण में संतुलित करने की आवश्यकता है।

इस उदाहरण पर गौर करें:

 ALTER TABLE Persons ADD CONSTRAINT pk_PersonID PRIMARY KEY (P_Id,LastName) 

जहां ट्यूपल " (पी_आईडी, लास्टलामेड) " को एक विशिष्टता की आवश्यकता है, और एक लंबा यूनिकोड अंतिम नाम और प्लस 4-बाइट पूर्णांक हो सकता है, यह (1) के लिए वांछनीय होगा कि इस बाधा को " एडीडी कन्स्ट्रैंट पीके_PersonID अद्वितीय गैर-अनुक्रमित (P_Id) , लास्टलाइम) "और (2) क्लस्टर किए गए सूचकांक की" प्राथमिक कुंजी "होने के लिए एक छोटे से सरोगेट कुंजी को अलग से घोषित करें यह ध्यान देने योग्य है कि अनीता संभवत: केवल इस बाध्यता के लिए अंतिम नाम को जोड़ना चाहती है ताकि एक ऐसा क्षेत्र तैयार किया जा सके जो एक संकलित सूचकांक में अनावश्यक है क्योंकि सभी फ़ील्ड इसके द्वारा कवर किए जाते हैं

एसक्यूएल सर्वर में एक प्राथमिक कुंजी को निरूपित करने की क्षमता, जिसका अर्थ है "दुर्भावनापूर्ण ऐतिहासिक परिस्थिति", जिसका मतलब है "प्राकृतिक प्राकृतिक या उम्मीदवार कुंजी" (तार्किक मॉडल से) के अर्थ के साथ भौतिक से "भंडारण में लुकअप कुंजी" के साथ एक दुर्भाग्यपूर्ण ऐतिहासिक परिस्थिति है आदर्श। मेरी समझ है कि मूल रूप से SYBASE SQL सर्वर ने हमेशा एक 4-बाइट रोविड का उपयोग किया है, भौतिक मॉडल से "भंडारण में लुकअप कुंजी" के रूप में, चाहे एक ढेर या एक संकुल सूचक में।

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

उदाहरण:

 Person(id, name, email, street, zip_code, area) 

id -> name,email, street, zip_code and area बीच एक कार्यात्मक निर्भरता हो सकती है id -> name,email, street, zip_code and area लेकिन अक्सर एक zip_code एक area से जुड़ा होता है और इस प्रकार zip_code -> area बीच एक आंतरिक कार्यात्मक निर्भरता zip_code -> area

इस प्रकार कोई इसे दूसरे तालिका में विभाजित कर सकता है:

 Person(id, name, email, street, zip_code) Area(zip_code, name) 

ताकि यह तीसरे सामान्य रूप से संगत हो ।

कुछ लोग "प्राथमिक कुंजी" शब्द का प्रयोग करते हैं, जो कि वास्तव में एक पूर्णांक कॉलम है, जो कि कुछ स्वचालित तंत्र द्वारा उत्पन्न मूल्यों को प्राप्त करता है। उदाहरण के लिए MySQL में AUTO_INCREMENT या माइक्रोसॉफ्ट एसक्यूएल सर्वर में IDENTITY । क्या आप इस अर्थ में प्राथमिक कुंजी का उपयोग कर रहे हैं?

यदि हां, तो इसका जवाब आपके द्वारा उपयोग किए जा रहे डेटाबेस के ब्रांड पर निर्भर करता है। MySQL में, आप ऐसा नहीं कर सकते, आपको एक त्रुटि मिलती है:

 mysql> create table foo ( id int primary key auto_increment, id2 int auto_increment ); ERROR 1075 (42000): Incorrect table definition; there can be only one auto column and it must be defined as a key 

डेटाबेस के कुछ अन्य ब्रांडों में, आप एक तालिका में एक से अधिक ऑटो-जनरेटिंग कॉलम को परिभाषित करने में सक्षम हैं।

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

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

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

कभी-कभी समय होते हैं जब आप एक से अधिक सरोगेट कुंजी चाहते हैं (जो आमतौर पर पीके हैं यदि आपके पास है)। इस मामले में जो आप चाहते हैं वह अधिक पीके नहीं है, यह ऑटोजनेरेट की गई कुंजी के साथ अधिक फ़ील्ड है अधिकांश डीबीएस यह अनुमति नहीं देते हैं, लेकिन इसके आसपास होने के तरीके हैं। पहले विचार करें कि यदि दूसरा क्षेत्र की पहली ऑटोगेनेटेड कुंजी (उदाहरण के लिए फ़ील्ड 1 * -1) के आधार पर गणना की जा सकती है या शायद दूसरी ऑटोजेनेरेट की गई कुंजी के लिए वास्तव में इसका मतलब है कि आपको एक संबंधित तालिका बनाना चाहिए। संबंधित तालिकाओं एक-से-एक रिश्ते में हो सकते हैं आप पैकेज़ टेबल से पीके को बाल तालिका में जोड़कर और फिर नए ऑटजनरेटेड फ़ील्ड को तालिका में जोड़कर लागू कर सकते हैं और फिर इस तालिका के लिए जो भी क्षेत्र उपयुक्त हैं I फिर पीके के रूप में दो चाबियों में से किसी एक को चुनें और दूसरे पर एक अनूठा सूचकांक दें (ऑटोजेंनेटेड फ़ील्ड को पीके होना जरूरी नहीं है)। और माता-पिता तालिका में फ़ील्ड में एफके जोड़ना सुनिश्चित करें सामान्य तौर पर यदि आपके पास बाल तालिका के लिए कोई अतिरिक्त फ़ील्ड नहीं है, तो आपको यह जांचना होगा कि आपको क्यों लगता है कि आपको दो ऑटोगनेरेटेड फ़ील्ड की आवश्यकता है

अच्छे तकनीकी उत्तर दिए गए हैं जितना मैं कर सकता हूं। मैं केवल इस विषय में जोड़ सकता हूं:

यदि आप कुछ चाहते हैं जो स्वीकार्य नहीं / स्वीकार्य है, तो कदम वापस लेने का एक अच्छा कारण है

  1. इसे स्वीकार्य क्यों नहीं है, इसकी मुख्य समझें
  2. दस्तावेज़ीकरण / जर्नल लेख / वेब और आदि में अधिक खोइए।
  3. वर्तमान डिजाइन का विश्लेषण और समीक्षा करें और प्रमुख दोषों को इंगित करें।
  4. नए डिजाइन के दौरान हर कदम पर विचार करें और जांचें।
  5. हमेशा तत्पर रहते हैं और अनुकूली समाधान बनाने का प्रयास करें।

आशा है कि यह किसी को मदद करेगा

एक ही समय में दो प्राथमिक कुंजी होने के कारण, संभव नहीं है लेकिन (यह मानते हुए कि आपने मामले को समग्र कुंजी के साथ गड़बड़ नहीं किया है), हो सकता है कि आपको एक विशेषता अद्वितीय बनाने के लिए क्या चाहिए।

 CREATE t1( c1 int NOT NULL, c2 int NOT NULL UNIQUE, ..., PRIMARY KEY (c1) ); 

हालांकि ध्यान दें कि रिलेशनल डेटाबेस में एक 'सुपर कुंजी' विशेषताओं का एक सबसेट है जो एक टेबल में ट्यूपल या पंक्ति को विशिष्ट रूप से पहचानती है ए 'कुंजी' एक 'सुपर कुंजी' है जिसकी एक अतिरिक्त संपत्ति है जो कि कुंजी से किसी भी विशेषता को हटाती है, उस कुंजी को एक 'सुपर कुंजी' (या बस एक 'कुंजी' कम से कम सुपर कुंजी) नहीं करता है यदि अधिक चाबियाँ हैं, तो वे सभी उम्मीदवार कुंजी हैं हम एक प्राथमिक कुंजी के रूप में उम्मीदवार कुंजी में से एक का चयन करें। इसलिए एक संबंध या तालिका के लिए कई प्राथमिक कुंजी के बारे में बात करना एक संघर्ष है।

हां, SQL में इसकी संभव है, लेकिन हम MsAccess में एक से अधिक प्राथमिक कुंजी सेट नहीं कर सकते फिर, मुझे अन्य डेटाबेस के बारे में नहीं पता है।

 CREATE TABLE CHAPTER ( BOOK_ISBN VARCHAR(50) NOT NULL, IDX INT NOT NULL, TITLE VARCHAR(100) NOT NULL, NUM_OF_PAGES INT, PRIMARY KEY (BOOK_ISBN, IDX) );