SQL键,MUL与PRI对比UNI

the*_*tro 234 mysql sql key

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

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

desc mytable; 
Run Code Online (Sandbox Code Playgroud)

其中一个字段显示为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    |       | 
+-----------+---------+------+-----+---------+-------+
Run Code Online (Sandbox Code Playgroud)

rob*_*ess 408

DESCRIBE <table>; 
Run Code Online (Sandbox Code Playgroud)

这实际上是一个快捷方式:

SHOW COLUMNS FROM <table>;
Run Code Online (Sandbox Code Playgroud)

无论如何,"Key"属性有三个可能的值:

  1. PRI
  2. UNI
  3. MUL

PRI和UNI的含义非常清楚:

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

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

如果PRIUNI,则该列是非唯一索引的第一列,其中在列中允许多次出现给定值.

还有一个最后的警告:

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

总的来说,MySQL文档非常好.如有疑问,请查看!

  • 这个答案要比公认的好得多. (64认同)
  • 另请注意,带有[引用另一个表的主键的**外键**]的表格(http://stackoverflow.com/a/25101478/632951)为"MUL". (12认同)
  • 在某些情况下,是否可以说MUL意味着密钥是外键? (6认同)
  • @robguinness,MySQL文档读起来就像它是由非英语编写的.很多时候,他们会用3行来解释可以用1行完成的事情. (4认同)
  • "主键必须包含唯一值." http://www.w3schools.com/sql/sql_primarykey.asp (3认同)
  • @pacerier,我同意你关于 MySQL 文档冗长的看法。这就是为什么 Stackoverflow 通常是我检查的第一个地方,尤其是当我赶时间的时候。;-) (3认同)
  • 这些文档和解释是在假设使用该语言所需的知识基础的情况下编写的。考虑进一步阅读任何令人困惑的术语 - 尝试学习基本概念,您将更容易理解文档。没有人可以回答您任何带有“MUL”的给定列是否是外键。它可能是,或者由于某些其他原因它可能有一个非唯一索引。 (2认同)

Mat*_*aly 142

这意味着该字段是(一部分)非唯一索引.你可以发行

show create table <table>;
Run Code Online (Sandbox Code Playgroud)

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

  • 如果该字段是非唯一索引的(一部分),那么为什么“MUL”只显示该列而不显示所有其他列。? (3认同)
  • 不一定涉及任何其他列。非唯一仅意味着相同的值可以在该列中出现多次。 (3认同)

Eri*_*ski 79

关于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)
Run Code Online (Sandbox Code Playgroud)

一列的表和一列上的索引具有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)
Run Code Online (Sandbox Code Playgroud)

具有作为主键的列的表具有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)
Run Code Online (Sandbox Code Playgroud)

具有唯一键的列的表具有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)
Run Code Online (Sandbox Code Playgroud)

包含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)
Run Code Online (Sandbox Code Playgroud)

在两列上具有两个单独索引的表具有每个列的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)
Run Code Online (Sandbox Code Playgroud)

索引跨越三列的表在第一列上具有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)
Run Code Online (Sandbox Code Playgroud)

具有引用另一个表的主键的外键的表是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)
Run Code Online (Sandbox Code Playgroud)

坚持在你的新皮层,并将表盘设置为"冰沙".


com*_*der 6

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

"MUL表示密钥允许多行具有相同的值.也就是说,它不是UNIque密钥."

例如,假设您有两个模型,Post和Comment.Post与Comment有很多关系.然后,对于Comment表,有一个MUL键(Post id)是有道理的,因为许多注释可以归属于同一个Post.

  • 如果它不是一个独特的键,为什么明确提到MUL?默认情况下它不是唯一的,不是吗?还是我错过了什么? (3认同)