MySQL 5到8查询迁移(重写)-表达式中的变量

时间:2019-03-23 15:26:02

标签: mysql variables migration warnings

我有一个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变量=表达式,...”或“ SELECT表达式”   INTO变量”。

使用方法:

  

替代方案:“ SET variable = expression,...”或“ SELECT”   表达式INTO变量”。

并更改此查询,以便它不会在MySQL8上生成警告?

是否存在有关如何正确地将查询从MySQL5重写到MySQL8的通用指南或建议/示例集,因此MySQL8上没有警告?

我希望通常从MySQL 5到MySQL 8的变量不是唯一需要重写的变量,还有什么?

请注意,问题不在于使用CTE,而是将变量的用法从MySQL 5重写为不会产生任何警告或错误的MySQL 8查询。

这个问题还只是关于在数据库服务器上产生预期的结果,完美地仅需一个查询(如果可能)

1 个答案:

答案 0 :(得分:-1)

替代方法是:

  1. 使用上一个问题的答案中所示的CTE。
  2. 将所有结果提取到您的应用程序中,并使用代码而不是SQL逐步计算值。