背景(基于innodb引擎)
众所周知,即使表设计时,没有设置自增id,数据行也会有一个隐藏的row_id代行其责;那么这么做会有一个怎么样的后果呢?
分析
如果创建的 InnoDB 表没有指定主键,也没有非空唯一键,那么 InnoDB 会给你创建一个不可见的,长度为 6 个字节的 row_id。
(InnoDB维护了一个全局的dict_sys.row_id值,所有没有主键、没有非空唯一键的InnoDB表,再每次插入一行数据时,都会将当前的dict_sys.row_id值作为要插入数据的row_id,然后dict_sys.row_id的值加1。)
注意,row_id的长度是6个字节,这也就表明,row_id的大小可能存在一定的限制?
6个字节所能表示的最大数字是:2的48次方-1;因此,row_id的值范围也就是0~2的48次方-1;也就是说,row_id是可以被用完的。
那么,当row_id用完后,继续插入数据会怎么样?
如果row_id的范围达到上限后,下一个值就是 0,然后继续循环。
显然,这样的数据覆盖的情况是我们无法接受的。
总结
从这个角度看,我们还是应该在 InnoDB 表中主动创建自增主键。因为,表自增 id 到达上限后,再插入数据时报主键冲突错误,是更能被接受的。
网友评论