网站建设推广公司,昆明网站建设织梦,网站内容管理系统怎么用,影视主题wordpress背景跟同学聊到row_id一个边界问题#xff0c;这里详细说明下。InnoDB表若没有定义主键#xff0c;会使用系统的一个默认递增row_id (dict_sys-row_id)作为主键。每次插入一行加1#xff0c;到达最大值循环复用。需要注意的是#xff0c;虽然dict_sys-row_id 被定义…背景跟同学聊到row_id一个边界问题这里详细说明下。InnoDB表若没有定义主键会使用系统的一个默认递增row_id (dict_sys-row_id)作为主键。每次插入一行加1到达最大值循环复用。需要注意的是虽然dict_sys-row_id 被定义为一个unsigned long long, 但由于这个主键值只有6个字节因此最大值是2^48。 row_id超过这个值还是会递增只是写入的时候只取低位可以认为是做取模操作。问题这就涉及到一个问题一个长期运行的MySQL里如果频繁插入删除行(像日志类的表)即使最终表规模不是很大仍可能会出现值row_id重用。而我们知道作为主键值是不能重复的。假设出现这种情况在一个表里新插入的一行的row_id与某一个年代久远的行的row_id出现冲突会肿么样验证其实本来这里只需要一个结论。本文的目的还是跟大家探讨一种验证的方法。有了上面的信息我们可以考虑设计如下的复现步骤1) 创建一张无主键空表2) gdb设置dict_sys-row_id为13) 往空表插入若干行4) gdb设置dict_sys-row_id为2^485) 再插入若干行6) 看结果结论可以看到行(1),(2)被覆盖了。比较合理点的方案应该是像MySQL的表内自增主键一样报个duplicate-key error.总结以上就是这篇文章的全部内容了希望本文的内容对大家的学习或者工作具有一定的参考学习价值谢谢大家对我们的支持。本文标题: MySQL InnoDB row_id边界溢出验证的方法步骤本文地址: http://www.cppcns.com/shujuku/mysql/281273.html