คีย์ SQL, MUL เทียบกับ PRI กับ UNI


248

ความแตกต่างระหว่างคืออะไรMUL, PRIและUNIใน MySQL?

ฉันทำงานกับแบบสอบถาม MySQL โดยใช้คำสั่ง:

desc mytable; 

หนึ่งในเขตที่มีการแสดงให้เห็นว่าเป็นMULกุญแจสำคัญคนอื่น ๆ แสดงเป็นหรือUNIPRI

ฉันรู้ว่าถ้าคีย์คือ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แสดงเฉพาะคอลัมน์นั้นและไม่ใช่คอลัมน์อื่นทั้งหมดด้วย
Vikas Goel

1
ไม่จำเป็นต้องมีคอลัมน์อื่นใดที่เกี่ยวข้อง ค่าที่ไม่ซ้ำกันหมายถึงค่าเดียวกันสามารถเกิดขึ้นได้มากกว่าหนึ่งครั้งในคอลัมน์นั้น
pgoetz

425
DESCRIBE <table>; 

นี่เป็นทางลัดโดยอัตโนมัติสำหรับ:

SHOW COLUMNS FROM <table>;

ในกรณีใด ๆ มีค่าที่เป็นไปได้สามค่าสำหรับแอตทริบิวต์ "Key":

  1. PRI
  2. UNI
  3. MUL

ความหมายPRIและUNIชัดเจนมาก:

  • PRI => คีย์หลัก
  • UNI => รหัสที่ไม่ซ้ำ

ความเป็นไปได้ที่สามMUL(ซึ่งคุณถาม) นั้นเป็นดัชนีที่ไม่ใช่คีย์หลักหรือคีย์เฉพาะ ชื่อนี้มาจาก "หลาย" เพราะอนุญาตให้มีค่าเดียวกันหลายครั้งได้ ตรงจากเอกสาร MySQL :

ถ้าKeyเป็นMULเช่นนั้นคอลัมน์คือคอลัมน์แรกของดัชนีที่ไม่ซ้ำซึ่งอนุญาตให้เกิดค่าที่กำหนดได้หลายค่าภายในคอลัมน์

นอกจากนี้ยังมีข้อแม้สุดท้าย:

หากมีมากกว่าหนึ่งในค่าที่สำคัญนำไปใช้กับคอลัมน์ที่กำหนดของตารางแสดงที่สำคัญอย่างหนึ่งที่มีความสำคัญสูงสุดในการสั่งซื้อPRI, ,UNIMUL

ตามปกติแล้วเอกสาร MySQL นั้นค่อนข้างดี หากมีข้อสงสัยให้ตรวจสอบออก!


3
"คีย์หลักต้องมีค่าที่ไม่ซ้ำกัน" w3schools.com/sql/sql_primarykey.asp
ktm5124

6
เป็นไปได้ไหมที่จะบอกว่าในบริบทบางอย่าง MUL หมายถึงกุญแจคือกุญแจต่างประเทศหรือไม่?
Armel Larcier

5
@robguinness เอกสาร MySQL อ่านเหมือนเขียนโดยไม่ใช่ภาษาอังกฤษ หลายครั้งที่พวกเขาจะใช้ 3 บรรทัดเพื่ออธิบายสิ่งที่สามารถทำได้ด้วย 1 บรรทัด
Pacerier

12
นอกจากนี้ยังทราบว่าตารางที่มีต่างประเทศที่สำคัญที่คีย์หลักอ้างอิงของตารางอีกคือ MUL
Pacerier

1
@pacerier ฉันเห็นด้วยกับคุณเกี่ยวกับความละเอียดของเอกสาร MySQL นั่นเป็นเหตุผลที่ Stackoverflow มักเป็นที่แรกที่ฉันเช็คเอาท์โดยเฉพาะอย่างยิ่งถ้าฉันรีบ ;-)
robguinness

86

คิดว่า MUL, PRI และ UNI ใน MySQL คืออะไร?

จากเอกสารMySQL 5.7 :

  • หาก Key คือ PRI คอลัมน์จะเป็นคีย์หลักหรือเป็นหนึ่งในคอลัมน์ในคีย์หลักหลายคอลัมน์
  • หาก Key คือ UNI คอลัมน์จะเป็นคอลัมน์แรกของดัชนี UNIQUE (ดัชนี UNIQUE อนุญาตให้มีค่า NULL หลายค่า แต่คุณสามารถบอกได้ว่าคอลัมน์อนุญาตให้ NULL โดยการตรวจสอบฟิลด์ Null หรือไม่)
  • หาก Key คือ 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)

ตารางที่มีหนึ่งคอลัมน์และดัชนีในหนึ่งคอลัมน์มี MUL:

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)

ตารางที่มีดัชนีครอบคลุม foo และ bar มี MUL บน foo เท่านั้น:

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)

ติดที่นีโอคอร์เท็กซ์ของคุณและตั้งปุ่มหมุนเป็น "frappe"


6

สำหรับมัลนี่เป็นเอกสารที่มีประโยชน์สำหรับฉัน - http://grokbase.com/t/mysql/mysql/9987k2ew41/key-field-mul-newbie-question

"MUL หมายความว่าคีย์อนุญาตให้หลายแถวมีค่าเท่ากันนั่นคือไม่ใช่รหัส UNIque"

ตัวอย่างเช่นสมมติว่าคุณมีสองรุ่นคือโพสต์และแสดงความคิดเห็น โพสต์มีความสัมพันธ์แบบ has_many กับความคิดเห็น มันจะสมเหตุสมผลสำหรับตารางความคิดเห็นที่มีคีย์ MUL (รหัสโพสต์) เนื่องจากความคิดเห็นจำนวนมากสามารถนำมาประกอบกับโพสต์เดียวกันได้


4
หากไม่ใช่เพียงรหัส UNIQUE ทำไมถึงพูดถึงอย่างชัดเจนว่าเป็น MUL โดยค่าเริ่มต้นมันไม่ใช่ UNIQUE อยู่แล้วใช่ไหม หรือฉันหายไปบางอย่าง
Sudip Bhandari

@SudipBhandari ถ้าคุณตั้งค่าดัชนีในเขตข้อมูลที่ไม่ได้เป็นค่าปฐมภูมิหรือไม่ซ้ำกัน MySQL จะกำหนดประเภทของคีย์เป็น MUL นอกเหนือจากคำอธิบายข้างต้นประเภทประเภทดังกล่าวจะช่วยให้ MySQL เข้าใจว่าเป็นดัชนีประเภทใด
Adnan
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.