【问题标题】:SQL keys, MUL vs PRI vs UNISQL 键,MUL vs PRI vs UNI
【发布时间】:2011-07-16 03:07:22
【问题描述】:

MySQL中MULPRIUNI有什么区别?

我正在使用以下命令进行 MySQL 查询:

desc mytable; 

其中一个字段显示为MUL 键,其他字段显示为UNIPRI

我知道如果键是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    |       | 
+-----------+---------+------+-----+---------+-------+

【问题讨论】:

    标签: mysql sql key


    【解决方案1】:

    让我们用简单的话来理解

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

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

    【讨论】:

      【解决方案2】:

      UNI:对于 UNIQUE

      • 它是一个表的一个或多个列的集合,用于唯一标识 记录。
      • 一个表可以有多个唯一键。
      • 允许唯一值很像主键,但 可以接受一个主键不接受的空值。

      PRI:对于 PRIMARY

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

      MUL:对于多个

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

      【讨论】:

        【解决方案3】:
        DESCRIBE <table>; 
        

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

        SHOW COLUMNS FROM <table>;
        

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

        1. PRI
        2. UNI
        3. MUL

        PRIUNI 的含义很清楚:

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

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

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

        还有一个最后的警告:

        如果多个 Key 值适用于表的给定列,则 Key 会显示优先级最高的值,顺序为 PRIUNIMUL

        作为一般说明,MySQL 文档非常好。如有疑问,请查看!

        【讨论】:

        • "主键必须包含唯一值。" w3schools.com/sql/sql_primarykey.asp
        • 是否可以说,在某些情况下,MUL 意味着键是外键??
        • @robguinness,MySQL 文档读起来就像是非英语编写的。很多时候,他们会用 3 行来解释可以用 1 行来完成的事情。
        • 另请注意,带有a foreign key that references another table's primary key 的表是MUL
        • @pacerier,关于 MySQL 文档的冗长性,我同意你的看法。这就是为什么 Stackoverflow 通常是我检查的第一个地方,尤其是当我赶时间的时候。 ;-)
        【解决方案4】:

        了解 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)
        

        将它贴在你的新皮质中,并将刻度盘设置为“frappe”。

        【讨论】:

          【解决方案5】:

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

          "MUL 表示该键允许多行具有相同的值。 也就是说,它不是唯一键。”

          例如,假设您有两个模型,帖子和评论。 Post 与 Comment 有 has_many 关系。那么评论表有一个 MUL 键(帖子 ID)是有意义的,因为许多 cmets 可以归因于同一个帖子。

          【讨论】:

          • 如果它不是唯一键,为什么要明确提到 MUL?默认情况下它不是唯一的,不是吗?还是我错过了什么?
          • @SudipBhandari 如果你在一个既不是主要也不是唯一的字段上设置索引,那么 MySQL 将键类型设置为 MUL,除了上面的解释,这种类型有助于 MySQL 理解它是什么样的索引正在处理。
          【解决方案6】:

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

          show create table <table>;
          

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

          【讨论】:

          • 如果该字段是(部分)非唯一索引,那么为什么MUL 只显示该列而不显示所有其他列。?
          • 不一定涉及任何其他列。非唯一意味着相同的值可以在该列中出现多次
          猜你喜欢
          • 2011-03-10
          • 1970-01-01
          • 2011-02-20
          • 2011-03-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-02-11
          相关资源
          最近更新 更多