MYSQL - 警告:#1287 在表达式中设置用户变量已弃用,将在未来版本中删除
MYSQL - Warning: #1287 Setting user variables within expressions is deprecated and will be removed in a future release
警告:#1287 在表达式中设置用户变量已被弃用,并将在未来的版本中删除。考虑备选方案:'SET variable=expression, ...' 或 'SELECT expression(s) INTO variables(s)'.
这是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;
我理解的问题在于:
`order` = @fromorder := @fromorder + 1
我猜这需要更改?
所以从这个:
+-------+-----------+
| 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 版本支持 window functions 并且通过使用 ROW_NUMBER()
window 函数您可以避免变量:
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;
参见demo。
警告:#1287 在表达式中设置用户变量已被弃用,并将在未来的版本中删除。考虑备选方案:'SET variable=expression, ...' 或 'SELECT expression(s) INTO variables(s)'.
这是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;
我理解的问题在于:
`order` = @fromorder := @fromorder + 1
我猜这需要更改?
所以从这个:
+-------+-----------+
| 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 版本支持 window functions 并且通过使用 ROW_NUMBER()
window 函数您可以避免变量:
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;
参见demo。