主键和索引键有什么区别?

62

有人能告诉我主键和索引键的区别吗?何时使用哪个?

5个回答

81

主键是一种特殊类型的索引,具有以下特点:

  • 只能有一个;
  • 不能为NULL;
  • 必须唯一。

通常使用主键作为最自然的行唯一标识符,例如社会保障号码、员工编号等,尽管有一种思路认为应该始终使用人造代理键。

另一方面,索引可用于基于其他列进行快速检索。例如,员工数据库可能将您的员工编号作为主键,但也可能在您的姓氏或部门上建立索引。

这两个索引(姓氏和部门)都会禁止NULL(可能)并允许重复(几乎肯定),它们将有助于加快寻找姓‘Corleone’或在“HitMan”部门工作的任何人的查询。


15
应说明主键始终具有索引,也就是说主键也总是索引键。 - Gabe
2
@Gabe,我认为只要说明主键是一种索引就可以了。说一个索引是被索引的似乎有点多余,但如果你能想出一个可行的改变(我做不到,可能只是我的限制),我会欢迎你的意见。 - paxdiablo
24
关键字并不是索引的一种!关键字(最小超键)是一组属性,其值对于每个元组都是唯一的。索引是一种性能优化功能,可以加快数据访问速度。 - nvogel
好的,也许可以这样说:“主键始终被索引,但与索引键相比具有特殊性质:”? - Gabe
3
@Gabe:并没有根本性的原因要求主键必须始终创建索引,虽然通常这是个很好的做法。关键字和索引是根本上不同且没有关联的东西,不要混淆它们。 - nvogel
我认为如果你想在主键上强制唯一性,你必须对其进行索引。数据列中的唯一性是通过后台索引的唯一性来实现的。 - figs_and_nuts

28

一个关键字(最小超键)是一组属性,其值对于每个元组(在某个时间点上表中的每一行)都是唯一的。

索引是一种性能优化功能,可以更快地访问数据。

关键字通常是索引的好选择,一些数据库管理系统会自动为关键字创建索引,但不一定是这样的。

“索引键”这个短语将这两个非常不同的词混合在一起,如果想避免任何混淆,最好避免使用它。有时,“索引键”用于表示“索引中的属性集”。 但是,所涉及的属性集不一定是关键字,因为它们可能不是唯一的。


换句话说,“key”和“primary key”是等效术语吗? - Mauritz Hansen
2
真正的“主”键与非主键没有任何区别。 - nvogel

4

Oracle Database会在表上创建一个唯一索引或主键完整性约束,以确保数据的唯一性。当启用此约束时,数据库会自动创建该索引。

您可以使用SQL语句CREATE INDEX显式地创建索引(约束之外)。

索引可以是唯一的或非唯一的。唯一索引确保表的关键列(或多个列)中没有两行具有重复值。非唯一索引不对列值施加此限制。

使用CREATE UNIQUE INDEX语句创建唯一索引。

指定与约束关联的索引

如果您需要更明确地控制与UNIQUE和PRIMARY KEY约束相关联的索引,则数据库允许您:

1. Specify an existing index that the database is to use 
   to enforce the constraint
2. Specify a CREATE INDEX statement that the database is to use to create 
   the index and enforce the constraint

这些选项是使用“USING INDEX”子句指定的。
例如:
 CREATE TABLE a (
 a1 INT PRIMARY KEY USING INDEX (create index ai on a (a1)));

http://docs.oracle.com/cd/B28359_01/server.111/b28310/indexes003.htm


1
其他回答定义了主键,但没有定义主索引。
主索引不是主键的索引。
主索引是您表格的数据结构,但仅当您的数据结构通过主键进行排序时,才能进行有效的查找,而无需使用单独的数据结构来查找主键记录。
所有数据库(据我所知)都有主键。
并非所有数据库都有主索引。大多数没有默认情况下在主键上建立二级索引。

0
如果你认为除了主键之外的其他列可能会或可能被用来访问你的数据,那么基本上就创建一个索引。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接