【问题标题】:User defined variable as alias MySQL v8.0 not working用户定义的变量作为别名 MySQL v8.0 不起作用
【发布时间】:2021-07-21 23:36:30
【问题描述】:

以下查询(这是一个压缩形式)运行良好,用户定义的变量在MySQL v5.6.20 上被选为别名,但在MySQL v8.0.23 上中断

SELECT *, @rank := @rank + 1 AS rank
        FROM q39wg_comments;

错误:

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'rank

【问题讨论】:

  • 它会抛出一个错误。用错误更新了问题。

标签: mysql mysql-8.0 mysql-5.6


【解决方案1】:

所以我终于弄明白了,这是因为 rank 现在是 MySQL 8.x.x 中的保留关键字,如 here 所述。

一旦我更新了变量名,查询就开始工作了。

另一种选择是使用反引号,我认为随着更多关键字的保留,它更适合未来,它可以防止您的 SQL 不必要地中断。例如。以下适用于 MySQL v8.x.x

例如:

SELECT *, @rank := @rank + 1 AS `rank`
FROM q29wg_jreviews_comments ;

【讨论】:

  • 是的,更改名称最简单。或者您可以将rank 放在反引号中。您链接到的手册页说明您可以使用保留字作为标识符,您只需对它们进行分隔即可。
  • 最简单的方法是使用 mysql v8 的内置排名函数,而不是使用传统的会话变量技巧来获取记录的排名。
  • 我很欣赏这个建议,这需要完全重构代码,目前我们无法为此分配资源,但从长远来看,我完全同意我们应该最多使用原生功能。
【解决方案2】:

你必须初始化@rank

试试这个:

SELECT *, @rank := @rank + 1 AS myrank
FROM q39wg_comments
JOIN ( SELECT @rank:=0 ) AS init;

https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=97b2c82bac1c4c2f5008a6e5f8298e04

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-26
    • 1970-01-01
    • 2017-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多