关系数据可依赖于主键,主键在物理层面上主要有两个用途:

  1. 唯一的标识一行
    因为主键可以唯一标识一行记录,所以可以确保执行数据更新、删除的时候不会出现张冠李戴的错误。
  2. 作为一个可以被外键引用的对象
    一个表的主键通常可以作为另一个表的外键,主键通过与外键构成参照完成性约束,防止出现数据不一致。

主键分为单列主键和复合主键:

  • 单一主键:只用一列来唯一标识一行
create table user(
    id varchar(4) primary key,  # 单列主键
    name varchar(4) not null, 
    email varchar(20) not null ,
    efftflag varchar(1) not null 
)
  • 联合主键:当使用一列不能唯一表示一行的时候,就要采用多列唯一标识一行,就是复合主键
create table uesr(
    id varchar(4) not null, 
    name varchar(6) not null,
    email varchar(3) not null, 
    efftflag varchar(1) not null, 
    primary key(id ,name )  # 复合主键
)

索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针。

索引可以提高查询速度,它就相当于字典的目录,通过它可以很快查询到结果,而不需要进行全表扫描。但过多使用索引会降低更新表的速度,如对表进行INSERT, UPDATE和DELETE时,Msql不仅要保存数据,还要保存索引文件。

索引可分为单列索引和复合索引:

  • 单列索引:只有某一列作为索引,默认为index索引,这一列可以包含重复数据。如果某列不存在重复数据,最好设置成唯一索引unique形式,它比index的索引速度更快。
  • 复合索引:每次检索都需要使用多列进行时,可以把多列设为复合索引。根据多列是否唯一,也分为index索引和unique索引。
    【注意】对于复合索引:Mysql是从左到右使用索引中的字段,一个查询可以只是用索引的一部分,但必须是左侧部分。如索引是indexName(a,b,c),则可以支持a|a,b|a,b,c3种组合进行查找。

总体来说:主键相当于一本书的页码,索引相当于书的目录。

两者的比较:

  • 主键是一定是唯一性索引,但唯一性索引不一定是主键
    数据库管理系统对于主键自动生成唯一索引,所以主键是一个特殊的索引
  • 唯一索引标识索引值唯一,一个表可以有多个唯一索引,但主键只能有一个
  • 主键列不能为空,但唯一索引列可以为空
  • 一张表只能有一个主键,但可以有多个索引