错误原因:
因为插入数据时除了没给id赋值,id的值为NULL之外,还存在其他字段的值为NULL,导致Sharding JDBC在。
真实执行的sql
格式化一下,可以看到一共11个字段,自动生成的id放到了最后(第11个),但是雪花算法生成的值却赋值到了第10个上(因为我除了没设置id之外,还有另外一个字段值也是NULL)
解决方案:
将值为NULL的列从sql语句里面删除,或者给一个默认值即可。
我使用的方案:
解决思路(单纯解决bug可以不看)
- 从sharding JDBC的执行sql的方法看一下源码是怎么写的
- 一直点方法进来,看一下sql里面的?参数是怎么转化的
- 直到SQL路由解析器ParsingSQLRouter这个类里面,一步步debug可以看到解析是有问题的。
- 进入方法里面看看
- 来看一下如何为生成的主键id填充值的
- 因为主键id生成后所对应的列是放到最后的,所以将index移动到最后即为主键id在参数列表中对应的index可以看到时根据VALUES(column1,column2。。。)中的每一个字段的值是否为NULL来判断index是否+1的如果有两个列的值都是NULL,会导致索引会少加一次,导致定位不到主键id在参数列表中所对应的真正的index