mysql的主键超过最大值

设置主键的情况下

在自增主键达到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达到上限时,插入数据,系统会提示报错信息,而不是覆盖数据。
因为数据覆盖意味着数据丢失,影响的是数据可靠性,而插入失败产生的报错,影响是可用性。
在数据业务中,可靠性通常是优先于可用性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值