【发布时间】:2019-03-23 15:26:02
【问题描述】:
我有一个 MySQL 5 查询,它生成所需的输出,但在 MySQL 8 上有警告。
我对变量的查询:
DROP TABLE IF EXISTS test;
CREATE TABLE test
(
id SERIAL PRIMARY KEY
, percent DECIMAL(5,2) NOT NULL
);
INSERT INTO test (percent) VALUES
(-0.50)
,(0.50)
,(1.00)
,(-0.20)
,(0.50)
,(-1.0)
,(-2.0)
,(0.75)
,(1.0)
,(0.50)
;
SELECT
percent,
CASE @i
WHEN 0 THEN ROUND(@i:=(@i+(percent * 1)),2) -1
ELSE ROUND(@i:=(@i+(percent * ABS(@i))) ,2) -1
END total_percent
FROM
test
, (SELECT @i:=1) vars
ORDER
BY id;
是this question
的答案之一并产生所需的输出:
+---------+---------------+
| percent | total_percent |
+---------+---------------+
| -0.50 | -0.50 |
| 0.50 | -0.25 |
| 1.00 | 0.50 |
| -0.20 | 0.20 |
| 0.50 | 0.80 |
| -1.00 | -1.00 |
| -2.00 | -3.00 |
| 0.75 | -1.50 |
| 1.00 | -1.00 |
| 0.50 | -0.50 |
+---------+---------------+
10 rows in set, 3 warnings (0.00 sec)
但有 3 个警告:
警告 |第1287章在表达式中设置用户变量是 已弃用,将在未来的版本中删除。考虑 备选方案:'SET variable=expression, ...' 或 'SELECT expression(s) INTO 变量'。
使用方法:
备选方案:'SET variable=expression, ...' 或 'SELECT 表达式 INTO 变量'。
并更改此查询,使其不会在 MySQL 8 上生成警告?
是否有任何关于如何将查询从 MySQL5 正确重写到 MySQL8 以使 MySQL8 没有警告的一般指南或建议/示例集?
我预计从 MySQL 5 到 MySQL 8 的一般变量不是唯一需要重写的变量,还有什么?
请注意,问题不是关于使用CTE,而是将变量的使用从 MySQL 5 重写为 MySQL 8 查询,不会产生任何警告或错误。
此外,这个问题仅是关于在数据库服务器上产生预期结果,只需一个查询即可(如果可能的话)
【问题讨论】:
-
在您提出的上一个问题中提供了一个解决方案,使用递归 CTE 查询。除此之外,如果您想要一个没有递归的迭代解决方案,您应该只从数据库中获取未计算的值并在您的应用程序代码中迭代地进行计算。
-
@BillKarwin 这个问题不是重复的,因为它专门要求一种应用
alternatives: 'SET variable=expression, ...', or 'SELECT expression(s) INTO variables(s)'.而不是使用CTE 的方法,+ 如何rewrite properly a query from MySQL5 to MySQL8- 什么是不兼容?与ans相关的问题。只是作为一个特定的sql查询的背景使用的例子。获取原始数据并在 DB 外部计算并将其插入回与使用 DB 本身进行大规模数据处理的全部目的相悖,但当数据集较小时是一种选择(不是我的情况) -
我将撤销关闭投票,但替代方案是:(1) 使用所示的 CTE,或 (2) 将所有结果提取到您的应用程序中并使用代码而不是 SQL 逐步计算值.
-
SET ..或SELECT .. INTO不会帮助您解决此任务。您需要迭代或乘法聚合函数。两者都在 SQL 中不可用。但是迭代可以用递归代替。所以你的另一个问题已经给出了答案。而且您仍然从另一个问题中忽略了 cmets。您没有 PK 也没有订单列。所以实际上没有答案。 -
@Paul Spiegel 如果测试表已更改,那么它有 PK 和 order 列,答案可能吗?
标签: mysql variables migration warnings