SQL键,MUL与PRI对比UNI

时间:2011-03-15 20:51:01

标签: mysql sql key

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

6 个答案:

答案 0 :(得分:378)

DESCRIBE <table>; 

这实际上是以下的捷径:

SHOW COLUMNS FROM <table>;

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

  1. PRI
  2. UNI
  3. MUL
  4. PRI和UNI的含义非常明确:

    • PRI =&GT;主键
    • UNI =&GT;唯一键

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

      

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

    还有一个最后的警告:

      

    如果多个Key值应用于表格的给定列,则Key会按PRIUNIMUL的顺序显示优先级最高的一个。

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

答案 1 :(得分:136)

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

show create table <table>;

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

答案 2 :(得分:70)

继续研究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)

一列中包含一列和一个索引的表格有一个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:唯一

  • 是表的一个或多个列的集合,用于唯一标识 记录。
  • 一个表可以有多个UNIQUE键。
  • 与主键非常相似,允许唯一值,但 可以接受一个空值,而主键则不能。

PRI:对于PRIMARY

  • 它也是表的一个或多个列的集合,用于唯一标识记录。
  • 一个表只能有一个PRIMARY键。
  • 与UNIQUE键很像,它允许唯一的值,但不允许 任何空值。

MUL:针对多个

  • 它也是表中一个或多个列的集合,但不 唯一地标识记录。
  • 一个表可以有多个MULTIPLE键。
  • 可以在添加索引或外键的表中创建它,它确实 不允许为空值。
  • 它允许在列中重复输入。
  • 如果我们不指定MUL列类型,那么它很像普通 列,但是也可以允许空条目;限制此类条目 我们需要指定它。
  • 如果我们在列上添加索引或添加外键,则自动MUL 密钥类型已添加。

答案 5 :(得分:0)

让我们用简单的话来理解

  • PRI - 这是一个主键,用于唯一标识记录。
  • UNI - 这是一个唯一键,也用于唯一标识记录。它看起来像主键,但一个表可以有多个唯一键,唯一键可以有一个空值,另一方面,表只能有一个主键,不能将空存储为主键。
  • MUL -它没有唯一约束,表可以有多个 MUL 列。

注意:这些键作为一个概念具有更深入的意义,但这是一个很好的开始。