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