背景(基于innodb引擎)

总所周知,即使表设计时,没有设置自增id,数据行也会有一个隐藏的row_id代行其责;那么这么做会有一个怎么样的后果呢?

分析

如果创建的 InnoDB 表没有指定主键,那么 InnoDB 会给你创建一个不可见的,长度为 6 个字节的 row_id。
注意,row_id的长度是6个字节,这也就表明,row_id的大小可能存在一定的限制?
6个字节所能表示的最大数字是:2的48次方-1;因此,row_id的值范围也就是0~2的48次方-1;也就是说,row_id是可以被用完的。

那么,当row_id用完后,继续插入数据会怎么样?
如果row_id的范围达到上限后,下一个值就是 0,然后继续循环。

显然,这样的数据覆盖的情况是我们无法接受的。

总结

从这个角度看,我们还是应该在 InnoDB 表中主动创建自增主键。因为,表自增 id 到达上限后,再插入数据时报主键冲突错误,是更能被接受的。

Q.E.D.

知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议

一个喜欢拔刀的萌新Coder