明智重蔵です。
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文でのユーザ変数の評価順序
このような公式資料がないのであれば、作ってほしいと思います。