GreatSQL社区

搜索

[已解决] bigint id从1000直接溢出问题

686 3 2024-8-26 18:42
今天开发反馈了一个问题,应用日志中报出了如下异常:

### 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最大值,公司数据库操作流程很严格也咨询过开发未进行过人为操作,请教这种问题还有什么原因可能导致?
全部回复(3)
yejr 2024-8-27 08:33:15
请先提供完整表结构DDL语句
lizibin 2024-8-27 23:30:18
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='用户订单表';
yejr 2024-8-28 09:31:29
lizibin 发表于 2024-8-27 23:30
CREATE TABLE `user_order` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `order_id` varchar(50) NO ...

看起来应该是应用程序端生成插入SQL时造成的问题,例如
  1. greatsql> select cast(-1 as unsigned);
  2. +----------------------+
  3. | cast(-1 as unsigned) |
  4. +----------------------+
  5. | 18446744073709551615 |
  6. +----------------------+
复制代码

在写入时,因为入参的数据类型不对(比如可能是varchar),需要转换成bigint(可能包含unsigned约束),那就会被强制转换成int/bigint最大值,第一次可以插入成功,第二次就报告主键冲突错误了。

还是先查查应用程序端吧,实在不知道怎么定位的话,可以短暂把 general log 打开帮助排查,参考 https://greatsql.cn/docs/8.0.32- ... ql-general-log.html
lizibin

9

主题

0

博客

64

贡献

注册会员

Rank: 2

积分
92

助人为乐(铜)

合作电话:010-64087828

社区邮箱:greatsql@greatdb.com

社区公众号
社区小助手
QQ群
GMT+8, 2024-11-21 18:18 , Processed in 0.019073 second(s), 15 queries , Redis On.
快速回复 返回顶部 返回列表