Sharding升级 4.0 版本升级到4.1 SQL 语法问题总结

Sharding 4.0 版本升级到4.1 SQL 语法问题总结

1. SQL语句建议全部小写,大写会出现路由到ds时出现全部ds转发问题。

2. 所有关联查询,如果主表或者关联表分片(分表)必须写别名。新版后SQL解析时,不在对SQL中表的别名进行处理。(PS路由速度大幅度提升)。

Local SQL (解析前)

select t_user.user_name,t_dep.dep_name from t_user 
left join t_dep on t_dep.dep_id = t_user.dep_id

4.0+ Actual SQL (解析后)

select t_user_1.user_name,t_dep_1.dep_name from t_user_1 
left join t_dep_1 on t_dep_1.dep_id = t_user_1.dep_id

4.1+ Actual SQL (解析后)

select t_user_1.user_name,t_dep_1.dep_name from t_user_1 
left join t_dep_1 on t_dep.dep_id = t_user.dep_id

以上例子就能明显的看出,sharding在4.1版本后只会对表进行解析处理,不会对列对应的别名进行处理。
解决思路

select user.user_name,dep.dep_name from t_user user
left join t_dep dep on dep.dep_id = user.dep_id

为所有的表添加上别名,并处理相关列。

3. 如果delete 中条件使用了表的别名,需要给表名称后添加别名

Local SQL (解析前)

delete from t_user where id= 1 and t_user.name = '张三'

4.0+ Actual SQL (解析后)

delete from t_user_1 where id= 1 and t_user_1.name = '张三'

4.1+ Actual SQL (解析后)

delete from t_user_1 where id= 1 and t_user.name = '张三'

以上例子就能明显的看出,sharding在4.1版本后只会对表进行解析处理,不会对列对应的别名进行处理。
解决思路

delete from t_user t_user where id= 1 and t_user.name = '张三'

为所有的表添加上别名。大家看着语法是不是有点奇怪,-_-!!! 我刚开始也一头雾水,这个语法需要将mysql升级mysql5.7是不支持,目前我是升级到8.0+。
docker mysql升级配置变化传送门

4. 如果条件使用函数(date_format、concat)、case when 、or 等语法时。会出现sharding类转换异常、字符串越界等问题。

解决思路对相应的条件添加()处理

select p_id from project
where (date_format( curdate(), '%y-%m-%d' )) 
between (date_format ( begin_date, '%y-%m-%d' )) 
and (date_format( end_date, '%y-%m-%d' ))
select * from project where (CONTACT(p_doc,'_',p_id)) in('xxxx_bbb')
select * from project where p_id = 1 and ((user_id) = 1 or (user_id) = -1 )

基本上目前碰见的问题,通过加()都得到了解决!!!后续继续跟踪。

本文地址:https://blog.csdn.net/zhangzhenisme/article/details/111026302

(0)
上一篇 2022年3月21日
下一篇 2022年3月21日

相关推荐