Kunci SQL, MUL vs PRI vs UNI

247

Apa perbedaan antara MUL, PRIdan UNIdi MySQL?

Saya sedang mengerjakan permintaan MySQL, menggunakan perintah:

desc mytable; 

Salah satu bidang ditampilkan sebagai MULkunci, yang lain ditampilkan sebagai UNIatau PRI.

Saya tahu bahwa jika suatu kunci PRI, hanya satu catatan per tabel dapat dikaitkan dengan kunci itu. Jika kuncinya adalah MUL, apakah itu berarti bahwa mungkin ada lebih dari satu catatan terkait?

Inilah tanggapan dari mytable.

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

Jawaban:

158

Ini berarti bahwa bidang tersebut adalah (bagian dari) indeks yang tidak unik. Anda bisa mengeluarkan

show create table <table>;

Untuk melihat informasi lebih lanjut tentang struktur tabel.

Matt Healy
sumber
2
Jika bidang itu (bagian dari) indeks tidak unik, lalu mengapa MULhanya ditampilkan terhadap kolom itu dan tidak semua kolom lainnya juga?
Vikas Goel
1
Tidak perlu ada kolom lain yang terlibat. Non-unik hanya berarti nilai yang sama dapat muncul lebih dari satu kali di kolom itu .
pgoetz
424
DESCRIBE <table>; 

Ini sebenarnya jalan pintas untuk:

SHOW COLUMNS FROM <table>;

Bagaimanapun, ada tiga nilai yang mungkin untuk atribut "Kunci":

  1. PRI
  2. UNI
  3. MUL

Arti PRIdan UNIcukup jelas:

  • PRI => kunci utama
  • UNI => kunci unik

Kemungkinan ketiga MUL,, (yang Anda tanyakan) pada dasarnya adalah indeks yang bukan kunci primer atau kunci unik. Nama ini berasal dari "beberapa" karena beberapa kejadian dengan nilai yang sama diperbolehkan. Langsung dari dokumentasi MySQL :

Jika Keyadalah MUL, kolom adalah kolom pertama dari indeks nonunique di mana beberapa kejadian dari nilai yang diberikan diijinkan dalam kolom.

Ada juga peringatan terakhir:

Jika lebih dari satu dari nilai-nilai Key berlaku untuk kolom tertentu dari tabel, menampilkan Key yang satu dengan prioritas tertinggi, dalam urutan PRI, UNI, MUL.

Sebagai catatan umum, dokumentasi MySQL cukup bagus. Jika ragu, periksa!

perampokan
sumber
3
"Kunci primer harus mengandung nilai unik." w3schools.com/sql/sql_primarykey.asp
ktm5124
6
Apakah mungkin untuk mengatakan, dalam beberapa konteks, bahwa MUL berarti kuncinya adalah kunci asing ??
Armel Larcier
4
@robguinness, dokumentasi MySQL berbunyi seperti ditulis oleh non-Inggris. Sering kali mereka akan mengambil 3 baris untuk menjelaskan sesuatu yang bisa dilakukan dengan 1 baris.
Pacerier
12
Juga Perhatikan bahwa meja dengan sebuah asing kunci yang kunci utama referensi meja lain adalah MUL.
Pacerier
@pacerier, saya setuju dengan Anda tentang verboseness dokumentasi MySQL. Itu sebabnya Stackoverflow biasanya tempat pertama yang saya kunjungi, terutama jika saya sedang terburu-buru. ;-)
perampokan
86

Walkthough tentang apa itu MUL, PRI dan UNI di MySQL?

Dari dokumentasi MySQL 5.7 :

  • Jika Kunci adalah PRI, kolom adalah KUNCI UTAMA atau merupakan salah satu kolom dalam KUNCI UTAMA multi-kolom.
  • Jika Kunci adalah UNI, kolom adalah kolom pertama dari indeks UNIQUE. (Indeks UNIK memungkinkan beberapa nilai NULL, tetapi Anda dapat mengetahui apakah kolom mengizinkan NULL dengan memeriksa bidang Null.)
  • Jika Kunci adalah MUL, kolom adalah kolom pertama dari indeks nonunique di mana beberapa kejadian dari nilai yang diberikan diizinkan dalam kolom.

Contoh Langsung

Grup kontrol, contoh ini tidak memiliki PRI, MUL, atau 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)

Tabel dengan satu kolom dan indeks pada satu kolom memiliki 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)

Tabel dengan kolom yang merupakan kunci utama memiliki 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)

Tabel dengan kolom yang merupakan kunci unik memiliki 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)

Tabel dengan indeks yang mencakup foo dan bar memiliki MUL hanya di 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)

Tabel dengan dua indeks terpisah pada dua kolom memiliki MUL untuk masing-masing

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)

Tabel dengan Indeks yang mencakup tiga kolom memiliki MULA pada yang pertama:

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)

Tabel dengan kunci asing yang merujuk kunci utama tabel lain adalah 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)

Tempelkan itu di neocortex Anda dan atur pemutar ke "frappe".

Eric Leschinski
sumber
6

Bagi Mul, ini juga merupakan dokumentasi yang bermanfaat bagi saya - http://grokbase.com/t/mysql/mysql/9987k2ew41/key-field-mul-newbie-question

"MUL berarti kunci memungkinkan beberapa baris memiliki nilai yang sama. Artinya, itu bukan kunci UNIque."

Sebagai contoh, katakanlah Anda memiliki dua model, Posting dan Komentar. Posting memiliki hubungan has_many dengan Komentar. Maka masuk akal jika tabel Komentar memiliki kunci MUL (Posting id) karena banyak komentar dapat dikaitkan dengan Posting yang sama.

berkomitmen dan lebih berani
sumber
4
jika itu bukan kunci UNIK, mengapa secara eksplisit disebut sebagai MUL? Secara default, itu bukan UNIK, kan? atau aku melewatkan sesuatu?
Sudip Bhandari
@SudipBhandari jika Anda menetapkan indeks pada bidang yang bukan primer atau unik, maka MySQL menetapkan jenis kunci sebagai MUL, selain penjelasan di atas, jenis-jenis seperti itu membantu MySQL untuk memahami jenis indeks yang dihadapinya.
Adnan