mysql:16413
From: <mysql201706mailing@xxxxxxxxxx>
Date: Sun, 25 Jun 2017 17:25:09 +0900 (JST)
Subject: [mysql 16413] ユーザ変数でRow_Number関数(ソートキーなし)の代用について
明智重蔵です。 SQLの間違い集2 MySQLのユーザ変数は評価順序が未定義 - Qiita http://qiita.com/AketiJyuuzou/items/cced9b70cc714b382d98 で私が書いた記事に関して、質問があります。 ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ 質問1 下記のRow_Number関数(ソートキーなし)と同じ結果を取得する ユーザ変数を使ったSQLは結果が保証されますか? 結果を保証するというのは、どのような実行計画と最適化の組み合わせでも、 期待した結果(分析関数のRow_Number関数と同じ結果)を返し、 期待した結果を返さなかったら、MySQLのバグだと言えることを意味してます。 create table IDTable( ID int, primary key(ID)); insert into IDTable values (1),(3),(5),(10),(20); -- Row_Number関数(ソートキーなし)を使ったSQL (MySQL8.0から多分動きます) select Row_Number() over() from IDTable -- ユーザ変数を使った上記と同じ結果を取得したいSQL select @rn := @rn+1 from IDTable, (select @rn := 0) 上記のユーザ変数を使ったSQLは、 5.6マニュアル(日本語)の https://dev.mysql.com/doc/refman/5.6/ja/user-variables.html >一般的なルールとして、SET ステートメント以外では、同じステートメント内で、 >ユーザー変数に値を割り当ててその値を読み取ることは決してしないでください。 >SELECT などのほかのステートメントでは、予想した結果が得られることもありますが、これは保証されません。 という記述に該当して、結果が保証されないと思いますが、 MySQLエキスパートの皆様は、どう考えますでしょうか? 私は、@rn := 0が、(1回目の@rn := @rn+1)の後で評価される可能性や、 2行以上の@rn := @rn+1がパラレル評価されて、連番が重複する可能性があると思います。 ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ 質問2 MySQLの公式資料で、上記のようなユーザ変数の使い方をしたSQLに対して、 マニュアルのちょい書きではなく、下記の7点セットを揃えて、 これは結果を保証しないSQL文だと明示してるような公式資料はありますか? 1番 Create Table文 2番 Insert文 3番 Select文 4番 3番のSelect文で期待する結果 5番 3番のSelect文で期待するユーザ変数の評価順序 6番 3番のSelect文で結果としてありうる期待しない結果 7番 6番のSelect文でのユーザ変数の評価順序 このような公式資料がないのであれば、作ってほしいと思います。