MySQL自定義變數實現row_number分析函式的天坑
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MySQL使用自定義變數模擬分析函式MySql變數函式
- mysql使用自定義序列實現row_number功能MySql
- mysql 自定義分析函式 least 及 日期函式MySql函式AST
- MySQL建立自定義函式MySql函式
- mysql自定義函式篇MySql函式
- MySQL分析函式實現MySql函式
- jQuery如何實現新增自定義函式jQuery函式
- 分析函式rank() row_number函式
- Oracle帶引數的自定義函式Oracle函式
- MySQL全面瓦解18:自定義函式MySql函式
- ROW_NUMBER() OVER() 分析函式的用法函式
- SQLserver自定義樣式主鍵-函式實現篇SQLServer函式
- 【Analytic】分析函式之ROW_NUMBER函式函式
- 案例展示自定義C函式的實現過程函式
- mysql中自定義變數有哪些MySql變數
- MySQL使用之五_自定義函式和自定義過程MySql函式
- MySQL自定義變數的三個小技巧MySql變數
- 13、MySQL Case-MySQL分析函式實現MySql函式
- 【Mysql】Mysql似oracle分析函式sum over的實現MySqlOracle函式
- C可變引數函式 實現函式
- MySQL自定義變數執行順序MySql變數
- 自定義函式實現字串分割,返回集合型別函式字串型別
- 分析函式學習3 ROW_NUMBER函式
- [譯] 為函式自定義屬性的八種實現方法函式
- MySQL自定義函式與儲存過程MySql函式儲存過程
- Linux Shell 自定義函式(定義、返回值、變數作用域)介紹Linux函式變數
- php實現函式可變引數列表PHP函式
- shell自定義函式函式
- Oracle 自定義函式Oracle函式
- perl自定義函式函式
- Oracle 中的 ROW_NUMBER() OVER() 分析函式的用法Oracle函式
- rank,dense_rank,row_number 分析函式函式
- 分析函式row_number()使用一例函式
- Apache Phoenix自定義函式(UDF)實踐Apache函式
- GRDB自定義的純函式函式
- HIVE中的自定義函式Hive函式
- tensorflow2 自定義損失函式使用的隱藏坑函式
- Hive常用函式及自定義函式Hive函式