主键和唯一索引的区别
主键约束比唯一索引约束严格,当没有设定主键时,非空唯一索引自动称为主键。对于主键和唯一索引的一些区别主要如下:
- 主键不允许空值,唯一索引允许空值。主键列在创建时,已经默认为空值 + 唯一索引了。
- 主键只允许一个,唯一索引允许多个。一个表最多只能创建一个主键,但可以创建多个唯一索引。
- 主键产生唯一的聚集索引,唯一索引产生唯一的非聚集索引(注:聚集索引确定表中数据的物理顺序,所以是主键是唯一的(聚集就是整理数据的意思)聚集(clustered)索引,也叫聚簇索引。)
- 主键可以被其他表引用为外键,而唯一索引不能。
- 主键更适合那些不容易更改的唯一标识,如自动递增列、身份证号等。在 RBO 模式下,主键的执行计划优先级要高于唯一索引。 两者可以提高查询的速度
- 索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针。总体来说:主键相当于一本书的页码,索引相当于书的目录。其实主键和索引都是键,不过主键是逻辑键,索引是物理键,意思就是主键不实际存在,而索引实际存在在数据库中,主键一般都要建,主要是用来避免一张表中有相同的记录,索引一般可以不建,但如果需要对该表进行查询操作,则最好建,这样可以加快检索的速度。
- 对于innodb,主键毫无疑问是一个聚集索引。但是当一个表没有主键,或者没有一个索引,innodb会如何处理呢。请看如下规则
如果一个主键被定义了,那么这个主键就是作为聚集索引
如果没有主键被定义,那么该表的第一个唯一非空索引被作为聚集索引
如果没有主键也没有合适的唯一索引,那么innodb内部会生成一个隐藏的主键作为聚集索引,这个隐藏的主键是一个6个字节的列,该列的值会随着数据的插入自增。文章知识点与