insert ignore into插入数据,提示执行成功,但数据库表中却没有新增数据 MySQL自增字段超出限制的方法
insert ignore into插入数据,提示执行成功,但数据库表中却没有新增数据 MySQL自增字段超出限制的方法
背景
客户反映我们系统中某信息没有了,我们的这个信息是从别的系统的数据库的视图中用定时任务同步过来的。
依次排查业务库和同步库,发现没有数据。查询视图(Oracle的plsql有坑,图形化界面有时加载不出)是有数据的。
问题描述
那么问题就在同步任务中了,然而,仔细检查同步任务,发现是成功执行了的,修改定时框架的日志级别,发现日志也是成功执行了sql。这条sql是:
insert ignore into sync_table (id, remark, message_time)
values ('3b24ab20-e231-4d8a-b98a-75c6e5fbb5bb', null, '2024-05-28 14:54:02')
原因分析
这条平平无奇的插入语句中,竟然出现了ignore,我觉得肯定是这个ignore掩盖了问题。
搜索得知,它会根据主键或者唯一索引判断将插入数据是否与已有数据冲突,不管有没有冲突,它的返回结果都是OK,但不一定会更新到数据库。
然而,我挑了一条数据出来,主键是自增所以不会冲突,于是把对应唯一索引的字段数据在库中查询,发现库中并没有这条冲突数据。
没有冲突,为什么放不进去呢?(没有测试手动执行SQL)
同事看了下 自动递增数值 2,147,483,647,说这个是多少位了?我放进计算器里一看二进制表示,4个字节的1,符号位0,这不就是int类型实际大小吗?
但是这个主键的定义是int(11),这11又是什么意思呢?
| Type | Storage (Bytes) | Minimum Value Signed | Minimum Value Unsigned | Maximum Value Signed | Maximum Value Unsigned |
|---|---|---|---|---|---|
| TINYINT | 1 | -128 | 0 | 127 | 255 |
| SMALLINT | 2 | -32768 | 0 | 32767 | 65535 |
| MEDIUMINT | 3 | -8388608 | 0 | 8388607 | 16777215 |
| INT | 4 | -2147483648 | 0 | 2147483647 | 4294967295 |
| BIGINT | 8 | -2^63 | 0 | 2^63-1 | 2^64-1 |
这个数真的就是有符号int能表示的最大数了,排查半天才找到问题所在,只怪我对数字太不敏感了,做了那么久算法题,int最大值是多少都不知道。
所谓int(11),不过是在建表时,勾选ZF属性,不满11位的数字会在左端填0
找到问题所在,只要把这个字段定义改成bigint就行了。
但是我还发现,这个表里的数据只有可怜的一百多万,可主键递增数竟然达到了十亿级,这显然是部署项目时,没有初始化这个数,几套项目都是如此传承下来,越滚越大,终于炸了。
其实也可以改自增起始值,但是怕数据库有别的数据捣乱,查起来又卡,不想费劲了,改定义一步到位拉倒。
解决方案
-- 修改自增字段的数据类型为BIGINT
ALTER TABLE table_name
MODIFY column_name BIGINT AUTO_INCREMENT;
或者
-- 重新设置自增字段的起始值为1000000
ALTER TABLE table_name
AUTO_INCREMENT = 1000000;
其他解决MySQL自增字段超出限制的方法详见博客
声明:本文使用八爪鱼rpa工具从gitee自动搬运本人原创(或摘录,会备注出处)博客,如版式错乱请评论私信,如情况紧急或久未回复请致邮 xkm.0jiejie0@qq.com 并备注原委;引用本人笔记的链接正常情况下均可访问,如打不开请查看该链接末尾的笔记标题(右击链接文本,点击 复制链接地址,在文本编辑工具粘贴查看,也可在搜索框粘贴后直接编辑然后搜索),在本人博客手动搜索该标题即可;如遇任何问题,或有更佳方案,欢迎与我沟通!
更多推荐


所有评论(0)