MYSQL-警告:1287在表达式中设置用户变量已被弃用,并将在将来的版本中删除

MYSQL-警告:1287在表达式中设置用户变量已被弃用,并将在将来的版本中删除,mysql,window-functions,row-number,Mysql,Window Functions,Row Number,警告:已弃用1287在表达式中设置用户变量,并将在将来的版本中删除。考虑备选方案:“设置变量=表达式,…”,或“选择表达式为无变量”。 这就是MySQL 8.0.21的内容。代码是有效的。。。但我也需要它在未来的版本中工作。。。。所以我的问题是什么是正确的警告方法 我需要一个变量设置为某个数字,我将通过一行的ID获取该数字。我需要它在每个SET语句中递增1 我应该如何更改此代码以使警告消失 SET @fromorder = (SELECT `order` FROM forms WHERE id=

警告:已弃用1287在表达式中设置用户变量,并将在将来的版本中删除。考虑备选方案:“设置变量=表达式,…”,或“选择表达式为无变量”。 这就是MySQL 8.0.21的内容。代码是有效的。。。但我也需要它在未来的版本中工作。。。。所以我的问题是什么是正确的警告方法

我需要一个变量设置为某个数字,我将通过一行的ID获取该数字。我需要它在每个SET语句中递增1

我应该如何更改此代码以使警告消失

SET @fromorder = (SELECT `order` FROM forms WHERE id=5);
/* SET @fromorder = 4;  - so this is the same in the example below */
UPDATE forms SET `order` = @fromorder := @fromorder + 1 WHERE `order` > -1 and `order` <= 4 ORDER BY `order` ASC;
SET @fromorder = null;
我想这需要改变

因此:

+-------+-----------+
|   id  |   order   |
+-------+-----------+
|   1   |   0       |
|   2   |   1       |
|   3   |   2       |
|   4   |   3       |
|   5   |   4       |
+-------+-----------+
我想通过这个查询得到这个示例:

+-------+-----------+
|   id  |   order   |
+-------+-----------+
|   1   |   5       |
|   2   |   6       |
|   3   |   7       |
|   4   |   8       |
|   5   |   9       |
+-------+-----------+

这是一个简单的for循环,增量+=1

您的MySql版本支持窗口函数,通过使用行数窗口函数,您可以避免变量:

UPDATE forms f
CROSS JOIN (SELECT `order` FROM forms WHERE id = 5) c
INNER JOIN (
  SELECT *, ROW_NUMBER() OVER (ORDER BY `order`) rn
  FROM forms
  WHERE `order` > -1 and `order` <= 4 
) t ON t.id = f.id
SET f.`order` = c.`order` + t.rn;

请参阅。

欢迎使用堆栈溢出。有关SQL相关问题,请参阅。您试图对此查询执行什么操作?请将您的问题包括示例表和您所拥有的行以及您希望从中得到的表。您所做的查询不会返回您预期的结果:原始订单是否始终是连续的?还是有人失踪了?@forpas我编辑了这篇文章,以确保正确。。。因为我不在乎结果。。。我只需要知道如何重写代码,使它做同样的事情,但不会抛出警告。哇,它的工作,你是一个传奇。。。非常感谢。
UPDATE forms f
CROSS JOIN (SELECT `order` FROM forms WHERE id = 5) c
INNER JOIN (
  SELECT *, ROW_NUMBER() OVER (ORDER BY `order`) rn
  FROM forms
  WHERE `order` > -1 and `order` <= 4 
) t ON t.id = f.id
SET f.`order` = c.`order` + t.rn;