MySQL v8.0.13警告1287不赞成在表达式中设置用户变量,并将在未来的版本中删除



在MySQL v8.0.13中执行以下查询会导致此错误:

0行受影响,1个警告:1287不赞成在表达式中设置用户变量,并将在将来的版本中删除。请改为在单独的语句中设置变量

SET @i = -1;
UPDATE `tb_test`
SET `order` = (@i := @i + 1)
ORDER BY `order` ASC;

关于如何在单独的语句中设置变量,有什么建议吗?

这真的是一个未知数(从未使用过mySQL(,但检查文档时它说:

"MySQL 8.0.13中不赞成在语句中设置除SET之外的用户变量。此功能可在MySQL 9.0中删除。">

(强调我的(。

所以,也许问题是你在不使用SET的情况下增加@i?你能用一个显式的SET重写它吗?看看它是否有帮助?

我选择的解决方案是使用Window函数,如中所述https://stackoverflow.com/a/65305941

WITH
ranking AS(
SELECT
`name`,
RANK() OVER (
ORDER BY `name` DESC
) ranking
FROM
`tb_test`
)
UPDATE
`tb_test`,
ranking r
SET
`tb_test`.`order` = r.ranking - 1
WHERE
`tb_test`.`name` = r.`name`
;

我在我的用例中遇到了这篇文章,试图解决同样的问题,即我找不到更好的方法来在引用语句的同一SELECT查询中分配用户变量,我已经考虑过利用对我来说不起作用的CTE,但我想我可能有一个建议:

SET @i = -1; UPDATE `tb_test` SET `order` = (@i + ROW_NUMBER()) ORDER BY `order` ASC;

如果你有不同的答案,我很想知道你是如何解决的。

最新更新