SQL键,MUL,PRI和UNI


246

是什么区别MULPRIUNI在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    |       | 
+-----------+---------+------+-----+---------+-------+

Answers:


157

这意味着该字段是非唯一索引(的一部分)。您可以发出

show create table <table>;

查看有关表结构的更多信息。


2
如果该字段是非唯一索引(的一部分),那么为什么MUL只针对该列而不是所有其他列显示?
Vikas Goel19年

1
不一定涉及其他任何列。非唯一表示同一个值在该列中可以出现多次。
pgoetz

423
DESCRIBE <table>; 

这实际上是以下各项的快捷方式:

SHOW COLUMNS FROM <table>;

在任何情况下,“键”属性都有三个可能的值:

  1. PRI
  2. UNI
  3. MUL

的意义PRIUNI十分清晰:

  • PRI =>主键
  • UNI =>唯一键

第三种可能性,MUL(您询问的)基本上是既不是主键也不是唯一键的索引。该名称来自“多个”,因为允许多次出现相同的值。直接来自MySQL文档

如果Key为is MUL,则该列是非唯一索引的第一列,在该列中允许多次出现给定值。

最后还有一个警告:

如果键值不止一个适用于表的给定列,键显示一个具有最高优先级,顺序PRIUNIMUL

作为一般说明,MySQL文档是相当不错的。如有疑问,请查看!


3
“主键必须包含唯一值。” w3schools.com/sql/sql_primarykey.asp
ktm5124 2013年

6
在某些情况下,可以说MUL表示密钥是外键吗?
Armel Larcier

4
@ robguinness,MySQL文档的读取方式类似于非英语。很多时候,他们用3行来解释用1行可以完成的事情。
和平者

12
还需要注意的是与表对外键引用另一个表的主键MUL
和平者

@pacerier,关于MySQL文档的详细信息,我同意您的看法。这就是为什么Stackoverflow通常是我首先检查的地方,特别是如果我急的话。;-)
robguinness

86

深入了解MySQL中的MUL,PRI和UNI是什么?

MySQL 5.7文档中:

  • 如果Key为PRI,则该列为PRIMARY KEY或为多列PRIMARY KEY中的列之一。
  • 如果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索引的表仅在foo上具有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)

将其贴在您的新皮层中,并将刻度盘设置为“ frappe”。


6

对于Mul来说,这对我也是有用的文档- http://grokbase.com/t/mysql/mysql/9987k2ew41/key-field-mul-newbie-question

“ MUL意味着键允许多行具有相同的值。也就是说,它不是UNIque键。”

例如,假设您有两个模型,“发布”和“评论”。Post与Comment具有has_many关系。那么对Comment表具有MUL键(Post id)将是有意义的,因为可以将许多评论归因于同一Post。


4
如果它不是唯一键,为什么要明确提及为MUL?默认情况下它不是唯一的,不是吗?还是我错过了什么?
Sudip Bhandari

@SudipBhandari如果您在既不是主字段也不是唯一字段的字段上设置索引,则MySQL会将键类型设置为MUL,除了上面的解释之外,这种类型的类型有助于MySQL理解它正在处理的索引类型。
阿德南(Adnan)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.