MySQL中的MUL,PRI和UNI有什么区别?
我正在使用以下命令处理MySQL查询:
desc mytable;
其中一个字段显示为MUL
密钥,其他字段显示为UNI或PRI。
我知道如果一个密钥是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 | |
+-----------+---------+------+-----+---------+-------+
答案 0 :(得分:378)
DESCRIBE <table>;
这实际上是以下的捷径:
SHOW COLUMNS FROM <table>;
在任何情况下,“Key”属性都有三个可能的值:
PRI和UNI的含义非常明确:
第三种可能性,MUL(你问过)基本上是一个既不是主键也不是唯一键的索引。名称来自“多个”,因为允许多个相同值的出现。直接从MySQL documentation:
如果
Key
为MUL
,则该列是非唯一索引的第一列,其中列中允许多次出现给定值。
还有一个最后的警告:
如果多个Key值应用于表格的给定列,则Key会按
PRI
,UNI
,MUL
的顺序显示优先级最高的一个。
总的来说,MySQL文档非常好。如有疑问,请查看!
答案 1 :(得分:136)
这意味着该字段是(非一部分)非唯一索引的一部分。你可以发出
show create table <table>;
要查看有关表结构的更多信息。
答案 2 :(得分:70)
来自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)
将它粘在你的新皮层中并将表盘设置为“冰沙”。
答案 3 :(得分:6)
对于穆尔来说,这对我来说也是有用的文档 - http://grokbase.com/t/mysql/mysql/9987k2ew41/key-field-mul-newbie-question
&#34; MUL表示该键允许多行具有相同的值。 也就是说,它不是UNIque键。&#34;
例如,假设您有两个模型,即帖子和评论。 Post与Comment有很多关系。因此,Comment表有一个MUL键(Post id)是有道理的,因为许多注释可以归属于同一个帖子。
答案 4 :(得分:1)
UNI:唯一:
PRI:对于PRIMARY :
MUL:针对多个:
答案 5 :(得分:0)
让我们用简单的话来理解
注意:这些键作为一个概念具有更深入的意义,但这是一个很好的开始。