美文网首页
MySQL在建表时如果没有指定主键会怎么样?

MySQL在建表时如果没有指定主键会怎么样?

作者: 飞跑的蛤蟆 | 来源:发表于2020-05-15 22:53 被阅读0次

简单回答

一般情况下,这样做并不会出现什么不好的情况,因为InnoDB会自动帮你创建一个不可见的、长度为6字节的row_id,而且这个row_id是由InnoDB维护全局的dictsys.row_id,每次插入一条数据时都会让全局row_id加一(未定义主键的表会使用全局row_id作为主键id)。

但是如果全局row_id一直涨,直到涨到248-1时,这时候再加一就会让低48位的row_id都为0,此时如果再插入一条数据,它拿到的row_id就是0,这样的话就有可能存在主键冲突的。

拓展

InnoDB会自动帮你创建一个不可见的、长度为6字节的row_id,而且InnoDB维护了一个全局的dictsys.row_id,所以未定义主键的表都会共享该row_id,每次插入一条数据都把全局row_id当成主键id,然后全局row_id加1。

该全局row_id在代码实现上使用的事bigint unsigned类型,但实际上只给row_id保留了6字节,所以这种设计就会存在一个问题:如果全局row_id一直涨,直到2的48次幂-1时,这个时候再加1,row_id的低48位都会变为0,如果再插入新一行数据时,拿到的row_id就为0,这样的话就存在主键冲突的可能,所以为了避免这种隐患,每个表都需要一个主键。

参考文档
面试官问:MySQL的自增ID用完了,怎么办?

相关文章

网友评论

      本文标题:MySQL在建表时如果没有指定主键会怎么样?

      本文链接:https://www.haomeiwen.com/subject/umhhohtx.html