在 InnoDB 存储引擎中, 表是按照主键顺序组织存放的在 InnoDB 存储引擎表中, 每张表都有主键 (primary key), 如果在创建表时没有显式地定义主键, 则 InnoDB 存储引擎会按如下方式选择或创建索引:
首先判断表中是否有非空的唯一索引 (unique not null), 如果有, 则该列即为主键;
如果不符合条件 1,InnoDB 存储引擎自动创建一个 6 字节大小的指针 (rowid 列)
当表中有多个非空唯一索引时, InnoDB 存储引擎选择建表时第一个定义的非空索引为主键
- create table t_sample (
- a int null,
- b int not null,
- c int not null,
- unique key(a),
- unique key(c),
- unique key(b)
- );
- insert into t_sample select 1, 2, 3;
- insert into t_sample select 1, 4, 5;
- insert into t_sample select null, 9, 7;
查询主键:
select t.*, t._rowid from t_sample t;
_rowid 可以显示表的主键, 从上图可以看出, 虽然 b 和 c 都是唯一索引, 但是 c 是先定义的, 故 InnoDB 存储引擎将其视为主键
来源: http://www.linuxidc.com/Linux/2018-03/151174.htm