SQL keys, MUL vs PRI vs UNI
MySQL中
我正在使用以下命令进行MySQL查询:
1 | desc mytable; |
其中一个字段显示为
我知道如果键是
这是
1 2 3 4 5 6 7 | +-----------+---------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-----------+---------+------+-----+---------+-------+ | courseid | int(11) | YES | MUL | NULL | | | dept | char(3) | YES | | NULL | | | coursenum | char(4) | YES | | NULL | | +-----------+---------+------+-----+---------+-------+ |
1 |
这实际上是以下目的的快捷方式:
在任何情况下,"键"属性都有三个可能的值:
-
PRI =>主键 -
UNI =>唯一键
第三种可能性
If
Key isMUL , the column is the first column of a nonunique index in which multiple occurrences of a given value are permitted within the column.
最后还有一个警告:
If more than one of the Key values applies to a given column of a table, Key displays the one with the highest priority, in the order
PRI ,UNI ,MUL .
作为一般说明,MySQL文档非常不错。如有疑问,请检查!
这意味着该字段是非唯一索引(的一部分)。您可以发出
查看有关表结构的更多信息。
深入了解MySQL中的MUL,PRI和UNI是什么?
从MySQL 5.7文档中:
- If Key is PRI, the column is a PRIMARY KEY or is one of the columns in a multiple-column PRIMARY KEY.
- If Key is UNI, the column is the first column of a UNIQUE index. (A UNIQUE index permits multiple NULL values, but you can tell whether the column permits NULL by checking the Null field.)
- If Key is MUL, the column is the first column of a nonunique index in which multiple occurrences of a given value are permitted within the column.
现场例子
对照组,此示例没有PRI,MUL或UNI:
1 2 3 4 5 6 7 8 9 10 | 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:
1 2 3 4 5 6 7 8 9 10 | 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
1 2 3 4 5 6 7 8 9 10 | 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:
1 2 3 4 5 6 7 8 9 10 | 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:
1 2 3 4 5 6 7 8 9 10 11 | 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
1 2 3 4 5 6 7 8 9 10 11 | 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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | 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表示键允许多行具有相同的值。
也就是说,它不是唯一键。"
例如,假设您有两个模型,"发布"和"评论"。 Post与Comment具有has_many关系。那么对Comment表具有MUL键(Post id)将是有意义的,因为可以将许多评论归因于同一Post。