🕳️

MySQL8.0.13以降では:=での変数への代入が非推奨になり、代替案としてINTOが推奨されている

2024/02/18に公開

これはなに

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