SQL 键,MUL vs PRI vs UNI

Posted

技术标签:

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

mysqlMULPRIUNI有什么区别?

我正在使用以下命令进行 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    |       | 
+-----------+---------+------+-----+---------+-------+

【问题讨论】:

【参考方案1】:

让我们用简单的话来理解

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

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

【讨论】:

【参考方案2】:

UNI:对于 UNIQUE

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

PRI:对于 PRIMARY

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

MUL:对于多个

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

【讨论】:

【参考方案3】:
DESCRIBE <table>; 

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

SHOW COLUMNS FROM <table>;

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

    PRI UNI 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 文档的冗长性,我同意你的看法。这就是为什么 *** 通常是我检查的第一个地方,尤其是当我赶时间的时候。 ;-)【参考方案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 只显示该列而不显示所有其他列。? 不一定涉及任何其他列。非唯一意味着相同的值可以在该列中出现多次

以上是关于SQL 键,MUL vs PRI vs UNI的主要内容,如果未能解决你的问题,请参考以下文章

MySQL Key值(PRI, UNI, MUL)的含义

VS2019里的数据库SQL?

HBase vs. MongoDB vs. MySQL vs. Oracle vs. Redi 大PK

vs2010安装完之后,怎么运行啊

vs2010怎么添加webservice

vs2015怎么连接mysql