主键(PRIMARY KEY)
表通常具有包含唯一标示表中每一行的值的一列或者一组列。这样的一列或者多列称为表的主键(PK),用于强制表的尸体完整性。在创建或者修改表时,您可以通过定义PK约束来创建主键。
一个表只能有一个PK约束,并且PK约束中的列不能接受空值。由于PK约束可以保证数据的唯一性,因此经常对标识列定义这种约束。
如果为表指定了PK约束,数据库引擎将通过为主键列创建唯一索引来强制数据的唯一性。当在查询中使用主键时,此索引还可以用来对数据进行快速访问。因此,所选的主键必须遵守创建唯一索引的规则。
创建主键时,数据库引擎会自动创建唯一的索引来强制实施PK约束的唯一性要求。如果表中不存在狙击索引或未显示指定非聚集索引,则将创建唯一的聚集索引以强制实施PK约束。
聚集索引
聚集索引给予数据行的兼职在表内排序和存储这些数据行。每个表只能有一个聚集索引,因为数据行本身只能按一个顺序存储。
每个表几乎都对列定义聚集索引来实现下列功能:
可用于经常使用的查询。
提供高度唯一性。
两者的比较
主键 | 聚集索引 | |
用途 | 强制表的实体完整性 | 对数据行的排序,方便查询用 |
一个表多少个 | 一个表最多一个主键 | 一个表最多一个聚集索引 |
是否允许多个字段来定义 | 一个主键可以多个字段来定义 | 一个索引可以多个字段来定义 |
是否允许null值 | 如果要创建的数据列中数据存在null,无法创建主键,创建表时指定的PK约束列隐式转换为Not null | 没有限制建立聚集索引的列一定必须Not null。也就是说可以猎德数据时null参看最后一项比较 |
是否要求数据必须唯一 | 要求数据必须唯一 | 数据既可以唯一,也可以不唯一。看你定义这个索引的UNIQUE设置。(这一点需要看后面的一个比较,虽然你的数据列可能不唯一,但是系统会替你产生一个你看不到的唯一列。) |
创建的逻辑 | 数据库在创建主键同时,会自动建立一个唯一索引。如果这个表之前没有聚集索引,同时建立主键时候没有强制指定使用非聚集索引,则同时建立一个唯一的狙击索引 | 如果未使用UNIQUE属性创建聚集索引,数据库引擎将向表自动添加一个死自己uniqueifier列。必要时,数据库引擎将向行自动添加一个uniqueifier值,使每个键唯一。此列和列值供内部使用,用户不能查看或访问。 |