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://www.uj5u.com/shujuku/233559.html
標籤:其他
上一篇:安碩資訊一面
