SQL कुंजी, MUL बनाम PRI बनाम UNI


247

बीच क्या अंतर है MUL, PRIऔर UNIMySQL में?

मैं कमांड का उपयोग करके MySQL क्वेरी पर काम कर रहा हूं:

desc mytable; 

खेतों में से एक को एक MULकुंजी के रूप में दिखाया गया है , अन्य लोग UNIया के रूप में दिखाते हैं PRI

मुझे पता है कि यदि कोई कुंजी है PRI, तो उस कुंजी के साथ प्रति तालिका केवल एक रिकॉर्ड जुड़ा हो सकता है। यदि एक कुंजी है MUL, तो क्या इसका मतलब है कि एक से अधिक संबद्ध रिकॉर्ड हो सकते हैं?

यहाँ की प्रतिक्रिया है mytable

+-----------+---------+------+-----+---------+-------+
| Field     | Type    | Null | Key | Default | Extra |
+-----------+---------+------+-----+---------+-------+
| courseid  | int(11) | YES  | MUL | NULL    |       | 
| dept      | char(3) | YES  |     | NULL    |       | 
| coursenum | char(4) | YES  |     | NULL    |       | 
+-----------+---------+------+-----+---------+-------+

जवाबों:


158

इसका मतलब है कि क्षेत्र एक गैर-अद्वितीय सूचकांक है। आप जारी कर सकते हैं

show create table <table>;

तालिका संरचना के बारे में अधिक जानकारी देखने के लिए।


2
यदि वह क्षेत्र एक गैर-अनूठे सूचकांक का (हिस्सा) है, तो MULकेवल उस कॉलम के खिलाफ क्यों नहीं दिखाया जाता है और अन्य सभी स्तंभों पर भी?
विकास गोयल

1
जरूरी नहीं कि इसमें कोई अन्य कॉलम शामिल हो। गैर-अद्वितीय का अर्थ है कि समान मान उस स्तंभ में एक से अधिक बार हो सकता है ।
पीगेट्ज़

424
DESCRIBE <table>; 

यह अकस्मात के लिए एक शॉर्टकट है:

SHOW COLUMNS FROM <table>;

किसी भी स्थिति में, "कुंजी" विशेषता के लिए तीन संभावित मूल्य हैं:

  1. PRI
  2. UNI
  3. MUL

के अर्थ PRIऔर UNIकाफी स्पष्ट हैं:

  • PRI => प्राथमिक कुंजी
  • UNI => अद्वितीय कुंजी

तीसरी संभावना, MUL(जिसके बारे में आपने पूछा है) मूल रूप से एक सूचकांक है जो न तो प्राथमिक कुंजी है और न ही एक अद्वितीय कुंजी है। नाम "एकाधिक" से आता है क्योंकि एक ही मूल्य की कई घटनाओं की अनुमति है। MySQL प्रलेखन से सीधे :

यदि Keyहै MUL, तो स्तंभ एक गैर-अनुक्रमणिका का पहला स्तंभ है जिसमें किसी दिए गए मान के कई आवृत्तियों को स्तंभ के भीतर अनुमति दी जाती है।

वहाँ भी एक अंतिम चेतावनी है:

कुंजी में मानों की एक से अधिक तालिका के किसी दिए गए स्तंभ पर लागू होता है, तो कुंजी प्रदर्शित करता है सर्वोच्च प्राथमिकता के साथ एक, क्रम में PRI, UNI, MUL

एक सामान्य नोट के रूप में, MySQL प्रलेखन काफी अच्छा है। जब संदेह हो, तो इसे देखें!


3
"प्राथमिक कुंजियों में अद्वितीय मान होना चाहिए।" w3schools.com/sql/sql_primarykey.asp
ktm5124

6
क्या कुछ संदर्भों में, यह कहना संभव है कि MUL का मतलब है एक विदेशी कुंजी?
आर्मेल लार्सर

5
@robguinness, MySQL डॉक्यूमेंटेशन जैसे कि यह गैर-अंग्रेजी द्वारा लिखा गया है। कई बार वे 1 लाइन के साथ किया जा सकता है कि कुछ समझाने के लिए 3 लाइनों ले जाएगा।
पचेरियर


1
@ स्पेसर, मैं MySQL प्रलेखन की क्रियाशीलता के संबंध में आपसे सहमत हूँ। यही कारण है कि आमतौर पर स्टैकओवरफ़्लो पहली जगह है जिसकी मैं जांच करता हूं, खासकर अगर मैं जल्दी में हूं। ;-)
रोबगिननेस

86

हालांकि, MySQL में MUL, PRI और UNI क्या है?

से MySQL 5.7 प्रलेखन:

  • यदि कुंजी PRI है, तो स्तंभ एक प्राथमिक कुंजी है या एक बहु-स्तंभ PRIMARY कुंजी में स्तंभों में से एक है।
  • यदि कुंजी UNI है, तो स्तंभ एक UNIQUE सूचकांक का पहला स्तंभ है। (एक UNIQUE सूचकांक कई NULL मानों की अनुमति देता है, लेकिन आप यह बता सकते हैं कि क्या NULL फ़ील्ड की जाँच करके कॉलम NULL को अनुमति देता है।)
  • यदि कुंजी MUL है, तो स्तंभ एक गैर-अनुक्रमणिका का पहला स्तंभ है जिसमें किसी दिए गए मान के कई आवृत्तियों को स्तंभ के भीतर अनुमति दी जाती है।

लाइव उदाहरण

नियंत्रण समूह, इस उदाहरण में न तो PRI, MUL और न ही UNI है:

mysql> create table penguins (foo INT);
Query OK, 0 rows affected (0.01 sec)

mysql> desc penguins;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| foo   | int(11) | YES  |     | NULL    |       |
+-------+---------+------+-----+---------+-------+
1 row in set (0.00 sec)

एक स्तंभ के साथ एक तालिका और एक स्तंभ पर एक सूचकांक में एक बहु है:

mysql> create table penguins (foo INT, index(foo));
Query OK, 0 rows affected (0.01 sec)

mysql> desc penguins;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| foo   | int(11) | YES  | MUL | NULL    |       |
+-------+---------+------+-----+---------+-------+
1 row in set (0.00 sec)

स्तंभ के साथ एक तालिका जो एक प्राथमिक कुंजी है, में PRI है

mysql> create table penguins (foo INT primary key);
Query OK, 0 rows affected (0.02 sec)

mysql> desc penguins;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| foo   | int(11) | NO   | PRI | NULL    |       |
+-------+---------+------+-----+---------+-------+
1 row in set (0.00 sec)

एक कॉलम जिसमें एक अद्वितीय कुंजी है, UNI है:

mysql> create table penguins (foo INT unique);
Query OK, 0 rows affected (0.01 sec)

mysql> desc penguins;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| foo   | int(11) | YES  | UNI | NULL    |       |
+-------+---------+------+-----+---------+-------+
1 row in set (0.00 sec)

फू और बार को कवर करने वाले सूचकांक के साथ एक तालिका में केवल फू पर MUL है:

mysql> create table penguins (foo INT, bar INT, index(foo, bar));
Query OK, 0 rows affected (0.01 sec)

mysql> desc penguins;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| foo   | int(11) | YES  | MUL | NULL    |       |
| bar   | int(11) | YES  |     | NULL    |       |
+-------+---------+------+-----+---------+-------+
2 rows in set (0.00 sec)

दो स्तंभों पर दो अलग-अलग इंडेक्स वाली एक तालिका में प्रत्येक के लिए MUL है

mysql> create table penguins (foo INT, bar int, index(foo), index(bar));
Query OK, 0 rows affected (0.01 sec)

mysql> desc penguins;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| foo   | int(11) | YES  | MUL | NULL    |       |
| bar   | int(11) | YES  | MUL | NULL    |       |
+-------+---------+------+-----+---------+-------+
2 rows in set (0.00 sec)

तीन स्तंभों वाले एक सूचकांक वाली तालिका में पहले MUL है:

mysql> create table penguins (foo INT, 
       bar INT, 
       baz INT, 
       INDEX name (foo, bar, baz));
Query OK, 0 rows affected (0.01 sec)

mysql> desc penguins;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| foo   | int(11) | YES  | MUL | NULL    |       |
| bar   | int(11) | YES  |     | NULL    |       |
| baz   | int(11) | YES  |     | NULL    |       |
+-------+---------+------+-----+---------+-------+
3 rows in set (0.00 sec)

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

mysql> create table penguins(id int primary key);
Query OK, 0 rows affected (0.01 sec)

mysql> create table skipper(id int, foreign key(id) references penguins(id));
Query OK, 0 rows affected (0.01 sec)

mysql> desc skipper;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id    | int(11) | YES  | MUL | NULL    |       |
+-------+---------+------+-----+---------+-------+
1 row in set (0.00 sec)

mysql> desc penguins;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id    | int(11) | NO   | PRI | NULL    |       |
+-------+---------+------+-----+---------+-------+
1 row in set (0.00 sec)

अपने नियोकार्टेक्स में छड़ी करें और डायल को "फ्रेपे" पर सेट करें।


6

मुल के लिए, यह मेरे लिए सहायक दस्तावेज भी था - http://grokbase.com/t/mysql/mysql/9987k2ew41/key-field-mul-newbie-question

"MUL का अर्थ है कि कुंजी कई पंक्तियों को समान मान देती है। यानी यह UNIque कुंजी नहीं है।"

उदाहरण के लिए, मान लें कि आपके पास दो मॉडल हैं, पोस्ट और टिप्पणी। पोस्ट का टिप्पणी के साथ has_many संबंध है। तब यह समझ में आता है कि टिप्पणी तालिका के लिए एक MUL कुंजी (पोस्ट आईडी) है क्योंकि कई टिप्पणियों को एक ही पोस्ट के लिए जिम्मेदार ठहराया जा सकता है।


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

@SudipBhandari यदि आप किसी ऐसे फ़ील्ड पर इंडेक्स सेट करते हैं, जो न तो प्राथमिक है और न ही अनोखा है, तो MySQL MUL के रूप में प्रमुख प्रकार को सेट करता है, इसके अलावा, इस तरह के प्रकार MySQL को यह समझने में मदद करते हैं कि यह किस तरह के इंडेक्स के साथ काम कर रहा है।
अदनान
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.