一、索引组织表的概念
- 在InnoDB中,表都是根据主键顺序组成存放的,这种存储方式的表称为索引组织表
二、表主键的确认规则
- 在InnoDB中,每张表都会有个主键
- 主键的确认的规则如下:
- ①创建表时指定的主键
- ②如果在创建表时没有显示地定义主键,则按照如下方式来选择或创建主键:
- 首先判断表中是否有非空的唯一索引(unique、not null)。如果有,则该列即为主键
- 当表中有多个非空唯一索引时,InnoDB会选择建表时第一个定义的非空唯一索引作为主键。这里需要注意的是:主键的选择根据的是定义索引的顺序,而不是建表时列的顺序(下面有演示案例)
- 如果不符合上述条件,InnoDB会自动创建一个6字节大小的指针
三、演示案例(_rowid)
- 下面演示在创建表时没有设定主键,验证系统自动分配主键的过程
- _rowid介绍:
- 作用:可以显示表的主键
- 备注:_rowid只能用于单个列作为主键的情况,对于多个列组成的主键就不能使用了(见下面演示案例②)
演示案例①
- 第一步:创建一张表格。其中c和d为非空且唯一,因此MySQL会从这两个字段中选择一个作为主键
create table z( a int not null, b int null, c int not null, d int not null, unique key(b), unique key(d), unique key(c) );
- 第二步:此时向表格中插入三行数据
insert into z select 1,2,3,4; insert into z select 5,6,7,8; insert into z select 9,10,11,12;
- 第三步:现在使用_rowid来显示表的主键,可以看到_rowid都指向于d那一列,因此d就是InnoDB默认识别的主键
select a,b,c,d,_rowid from z;
演示案例②
- 因为_rowid不能用于多个列组成的主键,下面进行简单的验证
- 第一步:创建一个表,其中将a和b的组成作为主键
create table a( a int, b int, primary key(a,b) )ENGINE=InnoDB;
- 第二步:插入一行数据
insert into a select 1,1;
- 第三步:再次使用_rowid用于查询,出错
select a,_rowid from a;