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 【问题描述】: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 | |
+-----------+---------+------+-----+---------+-------+
【问题讨论】:
【参考方案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
PRI
和UNI
的含义很清楚:
PRI
=> 主键
UNI
=> 唯一键
第三种可能性,MUL
,(你问过的)基本上是一个既不是主键也不是唯一键的索引。该名称来自“multiple”,因为允许多次出现相同的值。直接来自MySQL documentation:
如果
Key
是MUL
,则该列是非唯一索引的第一列,其中允许在该列中多次出现给定值。
还有一个最后的警告:
如果多个 Key 值适用于表的给定列,则 Key 会显示优先级最高的值,顺序为
PRI
、UNI
、MUL
。
作为一般说明,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的主要内容,如果未能解决你的问题,请参考以下文章