MySQL自定義變數實現row_number分析函式的天坑

壹頁書發表於2018-07-18

MySQL經常用自定義變數實現複雜查詢,比如row_number按組加行號的功能等.


但是這裡面存在一個天坑.不可謂不深


先看試驗

create table tmp_num(
	gid int,
    score int);
create table tmp_var(
	gid varchar(32),
    score int);
    
insert into tmp_num
select  
id%4,
ceil(1000*rand())
from nums where id<=20;
insert into tmp_var select concat('組',gid),score from tmp_num;




兩個表, 只是分組的型別不一樣,一個分組是 字串,另外一個是整形.


首先查詢分組是整形的情況

select  
t1.gid,t1.score,
case when @gid=gid then @rn:=@rn+1 when @gid:=gid then @rn:=1 else @rn:=1 end rn
from (
	select * from tmp_num ,(select @gid:=0,@rn:=0) vars order by gid,score
) t1;



如果其他的程式使用 該自定義變數查詢字串分組的情況,則會出現bug


select  
t1.gid,t1.score,
case when @gid=gid then @rn:=@rn+1 when @gid:=gid then @rn:=1 else @rn:=1 end rn
from (
	select * from tmp_var ,(select @gid:='',@rn:=0) vars order by gid,score
) t1;



在多個專案共用連線池的情況下,萬一出現這種情況,極難排查

等排查出來,生產環境的錯誤都不知道持續多少天了,

那時候就尷尬了,錯誤排除了,人也被開除了

所以還是 58處理的方式比較好,一刀切的禁用自定義變數


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29254281/viewspace-2158074/,如需轉載,請註明出處,否則將追究法律責任。

相關文章