SQL-ключи, MUL vs PRI и UNI

В чем разница между MUL, PRI и UNI в MySQL?

Я работаю над MySQL-запросом, используя команду:

desc mytable; 

Одно из полей показано как ключ MUL , другие отображаются как UNI или PRI.

Я знаю, что если ключ является PRI, к этому ключу может быть привязана только одна запись за таблицу. Если ключ MUL, означает ли это, что может быть более одной связанной записи?

Вот ответ моего стола.

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

Это означает, что поле является (частью) неуникальным индексом. Вы можете выдать

 show create table <table>; 

Чтобы узнать больше о структуре таблицы.

 DESCRIBE <table>; 

Это является ярким ярлыком для:

 SHOW COLUMNS FROM <table>; 

В любом случае существует три возможных значения для атрибута «Ключ»:

  1. PRI
  2. UNI
  3. MUL

Смысл PRI и UNI достаточно ясен:

  • PRI => первичный ключ
  • UNI => уникальный ключ

Третья возможность, MUL (о которой вы просили), в основном является индексом, который не является ни первичным ключом, ни уникальным ключом. Имя происходит от «multiple», потому что допускаются множественные вхождения одного и того же значения. Прямо из документации MySQL :

Если Key является MUL , столбец является первым столбцом неединичного индекса, в котором допускаются множественные вхождения определенного значения в столбце.

Существует также заключительная оговорка:

Если для данного столбца таблицы применяется более одного значения Key, Key отображает тот, который имеет наивысший приоритет, в порядке PRI , UNI , MUL .

В общем, документация MySQL неплохая. Если у вас есть сомнения, проверьте это!

Хотелось бы узнать, что такое MUL, PRI и UNI в MySQL?

Из документации MySQL 5.7 :

  • Если ключ является PRI, столбец является PRIMARY KEY или является одним из столбцов в нескольких столбцах PRIMARY KEY.
  • Если ключ является 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) 

Таблица с одним столбцом и индексом в одном столбце имеет 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».

Для Mul это была также полезная документация для меня – http://grokbase.com/t/mysql/mysql/9987k2ew41/key-field-mul-newbie-question

«MUL означает, что ключ позволяет нескольким строкам иметь одинаковое значение, то есть это не ключ UNIque».

Например, допустим, у вас две модели: «Почта» и «Комментарий». Сообщение имеет отношения has_many с комментарием. Тогда было бы целесообразно, чтобы таблица Comment имела ключ MUL (Post id), потому что многие комментарии могут быть отнесены к одной и той же Почте.

Это означает, что может быть только одна комбинация клавиш.

Например, если у вас есть таблица с первичным ключом (product_id, sequence_id), вы можете иметь несколько product_id 15s, несколько sequence_id 20, но только один набор (product_id, sequence_id) = (15, 20)