🕳️
MySQL8.0.13以降では:=での変数への代入が非推奨になり、代替案としてINTOが推奨されている
これはなに
MySQL8.0.13以降では:=を使った代入を行った際、以下のwarningが出るようになっています。
1287 Setting user variables within expressions is deprecated and will be removed in a future release. Consider alternatives: 'SET variable=expression, ...', or 'SELECT expression(s) INTO variables(s)'.
対応方法としては警告文の内容が全てです。このページでは代替案となるINTOでのやり方と、:=が非推奨となった経緯を紹介します。
代替案(INTOでの代入)
- 8.0系以前の実行例
SELECT
work_id,
@uid := user_id
FROM
works
WHERE
work_id = 1
;
- MySQL8.0.13以降
SELECT
work_id, user_id
INTO @wid, @uid
FROM
works
WHERE
work_id = 1
-- INTO @wid, @uid ここに書いてもいい。どこでも良い。
;
INTOの書く位置は自由なので、好きなところに書けます。なお、INTOした場合はSELECTの結果は表示されないため、別途変数を使って表示し直すことが必要になります。
公式ページ:https://dev.mysql.com/doc/refman/8.0/en/select-into.html
非推奨となった経緯
以下の通り、:=
を使った式では評価順序が保証されないため、非推奨となったようです。思った順番で代入されず、またエラーにもならないため意図と異なる結果が取得されてしまいます。この事象自体は8.0系以前から確認されていますが、明示的に非推奨となったのは8.0.13からのよう(こわい)。
The order of evaluation for expressions involving user variables is undefined. For example, there is no guarantee that
SELECT @a, @a:=@a+1
evaluates@a
first and then performs the assignment.
引用元:https://dev.mysql.com/doc/refman/8.0/en/user-variables.html
おわりに
AWSでのMySQL5.7系サポート終了に伴い、8.0系の情報を集めている方は多いと思います。ちょっとしたポイントですが頻出の箇所ではあると思うので、気にしてみてください。
Discussion