记录一次java.sql.SQLException: Column count doesn‘t match value count 排查的经过

MYSQL 同时被 2 个专栏收录
3 篇文章 0 订阅
1 篇文章 0 订阅

记录一次java.sql.SQLException: Column count doesn’t match value count 排查的经过

数据库是OceanBase
框架是Mybaties
插入的sql 由于公司代码需要保密,不方便截图,这里是伪代码
insert user(name,age,sex,personno)values(‘张三’,16,‘男’,410522200506303214);
id是自增主键 ,所以插入的列里没有id字段,分了10个库10表
{000-090:10}

分库分表规则是
toint(substr(personno,-3,2)) 取身份证号的倒数第二位和第三位作为分库分表位

排查开始:
第一步,看到这个错误,明显是插入的列和值的数量不匹配,但是仔细看了好几遍,确实是匹配的,很神奇
第二步:拿着报错的sql去dms执行了一遍,可以插入,这就很神奇了,sql没问题,但是代码去执行就报错
java.sql.SQLException: Column count doesn’t match value count
第三步:网上搜了一下别人遇到的这个坑,但是都和我的不一样。
第四部:
看下OceanBase的路由日志:
发现这条sql居然路由到了010这个库里,这就奇怪了,根据路由规则
SELECT substr(personno,-3,2) from user
获得的是21,应该路由到020的库里才对,很明显,路由出了问题

第五步:求助DBA的帮助,把排查步骤和结果描述了一下,DBA去看了下OceanBase的路由日志,发现路由规则不是**
toint(substr(personno,-3,2))**
而是:
toint(substr(certno,-3,2))**
因为这个路由规则不是我配置的,我去找了那个配置的同事,结果发现她是最开始配置了**toint(substr(certno,-3,2))***,原因就是从别的表配置里复制粘贴的,然后发现我们这个表没有这个certno字段,后来改成
toint(substr(personno,-3,2))

到这里结果就出来了,**toint(substr(personno,-3,2))***这个配置没有生效,去咨询了DBA,第一次默认生效,以后的变更只有这个库的owner或者DBA才有权限给手动生效,然后让DBA大佬给开了一下,问题解决

但是为什么会报出这个错误呢,我猜想了一下,应该是我们这个表没有certno这个字段,然后还根据这个字段去配置了分库分表规则,所以在OceanBase编译阶段,发现我们的insert语句里没有这一列,才会报出来列和值数量不匹配的错误,这真的是有点坑,一个问题搞了一天,不过也算是有收获吧

  • 1
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 1024 设计师:白松林 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值