SQL-Schlüssel, MUL vs PRI vs UNI

247

Was ist der Unterschied zwischen MUL, PRIund UNIin MySQL?

Ich arbeite an einer MySQL-Abfrage mit dem folgenden Befehl:

desc mytable; 

Eines der Felder wird als MULSchlüssel angezeigt , andere als UNIoder PRI.

Ich weiß, dass, wenn ein Schlüssel vorhanden ist PRI, diesem Schlüssel nur ein Datensatz pro Tabelle zugeordnet werden kann. Wenn ein Schlüssel vorhanden ist MUL, bedeutet dies, dass möglicherweise mehr als ein Datensatz zugeordnet ist?

Hier ist die Antwort von mytable.

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

Antworten:

158

Dies bedeutet, dass das Feld (Teil) eines nicht eindeutigen Index ist. Sie können ausstellen

show create table <table>;

Weitere Informationen zur Tabellenstruktur.

Matt Healy
quelle
2
Wenn dieses Feld (Teil) eines nicht eindeutigen Index ist, warum wird es dann MULnur für diese Spalte und nicht für alle anderen Spalten angezeigt?
Vikas Goel
1
Es sind nicht unbedingt andere Spalten beteiligt. Nicht eindeutig bedeutet nur, dass derselbe Wert in dieser Spalte mehrmals vorkommen kann .
Pgoetz
424
DESCRIBE <table>; 

Dies ist akut eine Abkürzung für:

SHOW COLUMNS FROM <table>;

In jedem Fall gibt es drei mögliche Werte für das Attribut "Schlüssel":

  1. PRI
  2. UNI
  3. MUL

Die Bedeutung von PRIund UNIist ganz klar:

  • PRI => Primärschlüssel
  • UNI => eindeutiger Schlüssel

Die dritte Möglichkeit MUL(nach der Sie gefragt haben) ist im Grunde ein Index, der weder ein Primärschlüssel noch ein eindeutiger Schlüssel ist. Der Name stammt von "multiple", da mehrere Vorkommen mit demselben Wert zulässig sind. Direkt aus der MySQL-Dokumentation :

Wenn dies der Fall Keyist MUL, ist die Spalte die erste Spalte eines nicht eindeutigen Index, in der mehrere Vorkommen eines bestimmten Werts innerhalb der Spalte zulässig sind.

Es gibt auch eine letzte Einschränkung:

Wenn mehr als eine der Schlüsselwerte bezieht sich auf eine bestimmte Spalte einer Tabelle, Key zeigt die mit der höchsten Priorität in der Reihenfolge PRI, UNI, MUL.

Generell ist die MySQL-Dokumentation recht gut. Wenn Sie Zweifel haben, probieren Sie es aus!

Robguinness
quelle
3
"Primärschlüssel müssen eindeutige Werte enthalten." w3schools.com/sql/sql_primarykey.asp
ktm5124
6
Kann man in einigen Zusammenhängen sagen, dass MUL bedeutet, dass der Schlüssel ein Fremdschlüssel ist?
Armel Larcier
4
@robguinness, die MySQL-Dokumentation liest sich so, als ob sie von Nicht-Englisch geschrieben wurde. Oft brauchten sie 3 Zeilen, um etwas zu erklären, was mit 1 Zeile gemacht werden könnte.
Pacerier
12
Beachten Sie auch, dass eine Tabelle mit einem Fremdschlüssel , der auf den Primärschlüssel einer anderen Tabelle verweist, lautet MUL.
Schrittmacher
@pacerier, ich stimme Ihnen in Bezug auf die Ausführlichkeit der MySQL-Dokumentation zu. Deshalb ist Stackoverflow normalerweise der erste Ort, an dem ich auschecke, besonders wenn ich es eilig habe. ;-)
Robguinness
86

Walkthough auf was ist MUL, PRI und UNI in MySQL?

Aus der MySQL 5.7- Dokumentation:

  • Wenn Key PRI ist, ist die Spalte ein PRIMARY KEY oder eine der Spalten in einem mehrspaltigen PRIMARY KEY.
  • Wenn Key UNI ist, ist die Spalte die erste Spalte eines UNIQUE-Index. (Ein EINZIGARTIGER Index erlaubt mehrere NULL-Werte, aber Sie können feststellen, ob die Spalte NULL zulässt, indem Sie das Feld Null aktivieren.)
  • Wenn Key MUL ist, ist die Spalte die erste Spalte eines nicht eindeutigen Index, in der mehrere Vorkommen eines bestimmten Werts innerhalb der Spalte zulässig sind.

Live-Beispiele

Kontrollgruppe, dieses Beispiel hat weder PRI, MUL noch 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)

Eine Tabelle mit einer Spalte und einem Index für die eine Spalte hat eine 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)

Eine Tabelle mit einer Spalte, die ein Primärschlüssel ist, hat 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)

Eine Tabelle mit einer Spalte, die ein eindeutiger Schlüssel ist, hat 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)

Eine Tabelle mit einem Index für foo und bar enthält MUL nur für 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)

Eine Tabelle mit zwei separaten Indizes für zwei Spalten enthält jeweils 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)

Eine Tabelle mit einem Index, der drei Spalten umfasst, enthält MUL für die erste:

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)

Eine Tabelle mit einem Fremdschlüssel, der auf den Primärschlüssel einer anderen Tabelle verweist, ist 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)

Stecke das in deinen Neokortex und stelle das Zifferblatt auf "frappe".

Eric Leschinski
quelle
6

Für Mul war dies auch eine hilfreiche Dokumentation für mich - http://grokbase.com/t/mysql/mysql/9987k2ew41/key-field-mul-newbie-question

"MUL bedeutet, dass mit dem Schlüssel mehrere Zeilen denselben Wert haben können. Das heißt, es ist kein UNIque-Schlüssel."

Angenommen, Sie haben zwei Modelle: "Posten" und "Kommentieren". Post hat eine has_many Beziehung zu Comment. Dann wäre es sinnvoll, wenn die Kommentartabelle einen MUL-Schlüssel (Post-ID) hätte, da viele Kommentare demselben Post zugeordnet werden können.

engagiertandroider
quelle
4
Wenn es sich einfach nicht um einen EINZIGARTIGEN Schlüssel handelt, warum ausdrücklich als MUL erwähnen? Standardmäßig ist es sowieso nicht EINZIGARTIG, oder? oder fehlt mir etwas
Sudip Bhandari
@SudipBhandari Wenn Sie den Index für ein Feld festlegen, das weder primär noch eindeutig ist, setzt MySQL den Schlüsseltyp als MUL. Zusätzlich zu der obigen Erklärung hilft diese Art von Typen MySQL zu verstehen, um welche Art von Index es sich handelt.
Adnan