MySQL中Key、Primary Key、Unique Key和Index的区别
Posted
技术标签:
【中文标题】MySQL中Key、Primary Key、Unique Key和Index的区别【英文标题】:Difference between Key, Primary Key, Unique Key and Index in MySQL 【发布时间】:2011-04-20 04:23:13 【问题描述】:什么时候应该使用KEY
、PRIMARY KEY
、UNIQUE KEY
和INDEX
?
【问题讨论】:
PRIMARY 键用于识别行,防止插入具有相同数据的两行... INDEX 键用于加速搜索(插入速度最小)。列中唯一数据的唯一键。 看看dba.stackexchange.com/questions/15572/…。还有***.com/questions/1401572/… Differences between INDEX, PRIMARY, UNIQUE, FULLTEXT in mysql?的可能重复 【参考方案1】:KEY 和 INDEX 是同义词。
当性能测量和 EXPLAIN 显示由于缺少索引而导致查询效率低下时,您应该添加索引。添加索引可以提高查询的性能(但会减慢对表的修改)。
当您希望将该列(或多列)中的值限制为唯一时,您应该使用 UNIQUE,以便尝试插入重复值会导致错误。
PRIMARY KEY 既是唯一约束,也意味着该列不是 NULL。它用于为每一行提供一个标识。这对于通过外键约束连接另一个表很有用。虽然表不需要 PRIMARY KEY,但这通常是个好主意。
【讨论】:
PRIMARY KEY 用于为每一行赋予标识?为我的无知道歉。 @needHELP:它用于唯一标识表中的任何行。例如,如果您想删除表中的特定行,有一些方法可以明确地识别它,这样您就不会意外删除错误的行。当它被索引时,它对于与另一个表连接也很有用。【参考方案2】:KEY
和 INDEX
在 MySQL 中是同义词。他们的意思是一样的。在数据库中,您可以使用indexes 来提高数据检索的速度。通常在JOIN
、WHERE
和ORDER BY
子句中使用的列上创建索引。
假设您有一个名为users
的表,并且您想要搜索所有姓氏为“Smith”的用户。如果没有索引,数据库将不得不遍历表中的所有记录:这很慢,因为数据库中的记录越多,查找结果所需的工作就越多。另一方面,索引将帮助数据库快速跳转到保存“Smith”记录的相关页面。这与我们人类通过电话簿目录查找姓氏的方式非常相似:我们不会开始从头到尾搜索目录,只要我们以某种顺序插入信息即可用于快速跳到“S”页。
主键和唯一键是相似的。主键是可以唯一标识行的列或列组合。它是unique key 的特例。一张表最多可以有一个主键,但可以有多个唯一键。当您在列上指定唯一键时,表中没有两个不同的行可以具有相同的值。
另请注意,定义为主键或唯一键的列会在 MySQL 中自动建立索引。
【讨论】:
我可以同时拥有相同值的唯一键和主键吗? @needHELP:如果您有一个名为passengers
的表具有以下字段:(id, first_name, last_name, age, passport_number)
,您通常会将id
列设置为主键。主键自动成为唯一键。主要区别在于表上只能有一个主键,并且列不能包含NULL
值。无需将id
列设置为UNIQUE
,因为通过将其设置为主键,它会自动保证是唯一的...然后您也可以将passport_number
设置为UNIQUE
,这样就不会不止一名乘客...
... 将能够拥有相同的护照号码。但是,您可能有一些没有护照号码的乘客(例如儿童)。在这种情况下,您可以在该列中插入NULL
,而不会出现问题。
@DanielVassallo 我喜欢你在 MySQL 使用的同义词之间清除它的方式。
最好的解释之一。非常感谢:-)【参考方案3】:
PRIMARY KEY
AND UNIQUE KEY
相似,只是功能不同。主键使表行唯一(即,不能有 2 行具有完全相同的键)。一个数据库表中只能有 1 个主键。
唯一键使表行中的表列唯一(即,没有 2 个表行可能具有相同的确切值)。您可以拥有多个唯一键表列(与主键不同,主键意味着表中只有 1 个表列是唯一的)。
INDEX
也创造了独特性。 MySQL(示例)将为被索引的列创建一个索引表。这样,在对该索引表列进行查询时,更容易检索表行值。缺点是,如果您进行多次更新/删除/创建,MySQL 必须管理索引表(这可能是性能瓶颈)。
希望这会有所帮助。
【讨论】:
另外,UNIQUE KEY
可以是 NULL
,但 PRIMARY KEY
不能是 NULL
。
PRIMARY KEY 是否有助于像普通 INDEX 一样进行索引/搜索?
@razor 是的。【参考方案4】:
唯一键:没有两行相似的列
主键:可以唯一标识表中每一行的最小列数的集合(即在构成主键的所有列中没有两行是相似的)。一个表中可以有多个主键。如果存在唯一键,则它是表中的主键(不是“主键”)。如果不存在唯一键,则需要多个列值来标识行,例如(first_name、last_name、father_name、mother_name)在某些表中可以构成主键。
索引:用于优化查询。如果您要根据某个列多次搜索或排序结果(例如,大多数人会按姓名而不是他们的卷号来搜索学生。)那么如果列值都是“索引”,例如使用二叉树算法。
【讨论】:
我想你的意思是说一个表中只能有一个 PK【参考方案5】:主键 - 我们只能将一个表上的一个主键放入一个表中,当我们将值输入到表中时,我们不能将该列留空。
唯一键 - 我们可以在一张表上放置多个唯一键,当我们将值输入表中时,我们可以将该列留空。 当我们应用主键和唯一键时,列采用唯一值(不相同)。
【讨论】:
表只有一个PRIMARY KEY,但唯一键不止一个。 INDEX 怎么样?【参考方案6】:主键不允许NULL
值,但唯一键允许NULL
值。
我们可以在一个表中只声明一个 主键,但一个表可以有多个 唯一键 (列分配)。
【讨论】:
【参考方案7】:主键用于处理不同的表。这是关系数据库的基础。如果您有图书数据库,最好创建 2 个表 - 1) 图书和 2) 具有 INT 主键“id”的作者。然后你在书中使用 id 而不是作者姓名。
如果您不想重复输入,则使用唯一键。例如,您的图书表中可能有标题,并希望确保每个标题只有一个条目。
【讨论】:
【参考方案8】:唯一密钥:
-
多个值可以为空。
两个元组的唯一键值不能相同。
一个或多个唯一键可以组合成一个主键,反之则不行。
主键
-
可以包含多个唯一键。
唯一地表示一个元组。
【讨论】:
INDEX 怎么样?以上是关于MySQL中Key、Primary Key、Unique Key和Index的区别的主要内容,如果未能解决你的问题,请参考以下文章
MySQL中Key、Primary Key、Unique Key和Index的区别
MYSQL 的 primary key 和unique key 的区别
mysql中key primary key unique key 与index区别
mysql中key primary key unique key 与index区别