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”属性都有三个可能的值:
- PRI
- UNI
- MUL
PRI和UNI的含义非常明确:
- PRI =>主键
- UNI =>唯一密钥
第三种可能性MUL(你问到的)基本上是一个既不是主键也不是唯一键的索引。 名称来自“多个”,因为多个相同值的出现是允许的。 直接从MySQL文档 :
如果
Key
为MUL
,则该列是列中允许出现多个给定值的非唯一索引的第一列。
还有一个最后的警告:
如果多个Key值应用于表的给定列,
MUL
PRI
,UNI
,MUL
的顺序显示具有最高优先级的那个值。
作为一般说明,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)