bigint id从1000直接溢出问题
今天开发反馈了一个问题,应用日志中报出了如下异常:### SQL: INSERT INTO user_order( order_id, user_id, vin, battery_capacity, create_time, update_time )VALUES( ?, ?, ?, ?, ?, ? )
### Cause: java.sql.SQLIntegrityConstraintViolationException: Duplicate entry '9223372036854775807' for key 'PRIMARY'
; Duplicate entry '9223372036854775807' for key 'PRIMARY'; nested exception is java.sql.SQLIntegrityConstraintViolationException: Duplicate entry '9223372036854775807' for key 'PRIMARY'
从直观印象看是主键冲突,这很好理解,问题点在于此表是一个非核心业务的数据表,原自增id为1007,问题出现直接溢出bigint最大值,公司数据库操作流程很严格也咨询过开发未进行过人为操作,请教这种问题还有什么原因可能导致?
请先提供完整表结构DDL语句 yejr 发表于 2024-8-27 08:33
请先提供完整表结构DDL语句
CREATE TABLE `user_order` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`order_id` varchar(50) NOT NULL COMMENT '订单id',
`user_id` varchar(50) NOT NULL COMMENT '用户id',
`vin` varchar(255) NOT NULL COMMENT '车架号',
`battery_capacity` decimal(10,5) DEFAULT NULL COMMENT '电池容量',
`energy` decimal(10,5) DEFAULT NULL COMMENT '综合能耗',
`cruising_ability` decimal(10,5) DEFAULT NULL COMMENT '续航能力',
`security_level` decimal(10,5) DEFAULT NULL COMMENT '安全级别',
`soh` decimal(10,5) DEFAULT NULL COMMENT '电池健康度',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=1023 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='用户订单表'; lizibin 发表于 2024-8-27 23:30
CREATE TABLE `user_order` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`order_id` varchar(50) NO ...
看起来应该是应用程序端生成插入SQL时造成的问题,例如
greatsql> select cast(-1 as unsigned);
+----------------------+
| cast(-1 as unsigned) |
+----------------------+
| 18446744073709551615 |
+----------------------+
在写入时,因为入参的数据类型不对(比如可能是varchar),需要转换成bigint(可能包含unsigned约束),那就会被强制转换成int/bigint最大值,第一次可以插入成功,第二次就报告主键冲突错误了。
还是先查查应用程序端吧,实在不知道怎么定位的话,可以短暂把 general log 打开帮助排查,参考 https://greatsql.cn/docs/8.0.32-26/2-about-greatsql/4-7-greatsql-general-log.html
页:
[1]