在InnoDB 存储引擎中,表都是根据主键顺序组织存放的,这种存储方式的额表称为索引组织表。在InnoDB存储引擎表中,每张表都有个主键(Primary key),如果在创建表时 没有显示地定义主键,则InnoDB存储引擎会按如下方式选择或创建主键:
首先判断表是否有非空的唯一索引(Unique not null),如果有,则该列即为主键。
如果不符合上述条件,InnoDB存储引擎自动创建一个6字节大小的指针。
当表中有多个非空唯一索引时,InnoDB 存储引擎将选择建表时第一个定义的非空唯一索引为主键。这里需要注意的是,主键的选择根据的是定义索引的顺序,而不是建表时列的顺序。看下面的例子:
上述示例创建了一张z表,有a、b、c、d四个列。b c d三列上都有唯一索引,不同的是b类允许NULL值。由于没有显式地定义主键,因此会选择非空的唯一索引,可以通过下面的SQL语句判断表的主键值:
_rowid 可以显示表的主键,因此通过上述查询可以找到表z的主键。此外,虽然c、d列都是非空唯一索引,都可以作为主键的候选,但是在定义的过程中,由于d 列首先定义为唯一索引,故InnoDB存储引擎将其视为主键。
另外需要注意的是,_rowid只能 用于查看单个类为主键的情况,对于多列组成的主键就显得无能为力了。