SQL键,MUL vs PRI vs UNI

MUL,PRI和UNI在MySQL中有什么区别?

我正在使用以下命令来处理MySQL查询:

desc mytable; 

其中一个字段显示为MUL键,其他字段显示为UNI或PRI。

我知道,如果一个键是PRI,每个表只能有一个logging与该键相关联。 如果一个密钥是MUL,那么这是否意味着可能有多个关联的logging?

这是mytable的回应。

 +-----------+---------+------+-----+---------+-------+ | 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>; 

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

  1. PRI
  2. UNI
  3. MUL

PRI和UNI的含义非常明确:

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

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

如果KeyMUL ,则该列是列中允许出现多个给定值的非唯一索引的第一列。

还有一个最后的警告:

如果多个Key值应用于表的给定列, MUL PRIUNIMUL的顺序显示具有最高优先级的那个值。

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

在MySQL中,什么是MUL,PRI和UNI?

从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的索引表仅在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) 

坚持在你的大脑皮层,并将拨号设置为“冰沙”。

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

“MUL表示该键允许多行具有相同的值,即它不是一个UNIque键。

例如,假设您有两个模型,Post和Comment。 post与评论有一个has_many关系。 因此,评论表有一个MUL键(Post ID)是有意义的,因为很多评论可以被归于相同的Post。

这意味着只能有一个键的组合。

例如,如果您有一个包含主键(product_id,sequence_id)的表,则可以有多个product_id 15s,多个sequence_id 20,但只有一个(product_id,sequence_id)=(15,20)