mysql的主键超过最大值

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

设置主键的情况下

在自增主键达到int64最大后再次插入一行记录报错如下
Duplicate entry ‘4294967295’ for key ‘increment_id_test.PRIMARY’
唯一键冲突报错当auto_incement达到上限后再次申请下一个id时得到的值保持不变。

在建表时通常都会将主键id设置为8字节的bigint unsigned (2^64)
理论上在并发够大时间够长的情况下还是有可能达到其上限
但到目前为止还没有一个mysql实例超过这个上限实际中不会发生。

未设置主键的情况下

如果数据表没有设置主键那么Innodb会给该表设置一个不可见长度为6字节的默认主键row_id。
Innodb维护了一个全局的dict_sys.row_id值它被所有无主键的数据表共同使用。
每个无主键的数据表插入一行数据都会将当前dict_sys.row_id的值加1

1.row_id写入表中的值范围是从0-2^48-1。
2.当row_id的值为2^48时再进行数据插入那么row_id的后6个字节的值就全部为0了。

当row_id的值到了2^48次方-1后再次插入数据下一个值是0然后开始循环。
不过和自定义主键不同的是row_id标识的主键没有唯一性约束。
当插入数据的row_id值在表中已经存在那么写入的数据会覆盖已存在的数据且不会报错。

Innodb没有暴露出修改该值的接口和命令。

总结

在设计表时最好还是使用自定义主键而不要使用Innodb的默认主键。
至少在自定义主键的场景下当自增id达到上限时插入数据系统会提示报错信息而不是覆盖数据。
因为数据覆盖意味着数据丢失影响的是数据可靠性而插入失败产生的报错影响是可用性。
在数据业务中可靠性通常是优先于可用性。

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: mysql

“mysql的主键超过最大值” 的相关文章