MySQL 8.0获取行号报错求助(将用于Apache Spark)
解决MySQL 8.0获取行号的语法错误问题
错误原因
你的SQL语句报错是因为row_number是MySQL 8.0的保留关键字,直接将它用作列别名会触发语法解析错误。
解决方案
方案1:修正原有变量写法
给row_number别名加上反引号,避免和关键字冲突:
SELECT @rownum:=@rownum + 1 as `row_number`, t.* FROM ( select * from myTable ) t, (SELECT @rownum := 0) r
方案2:使用MySQL 8.0推荐的窗口函数(更适合Spark迁移)
MySQL 8.0已经支持标准SQL的窗口函数ROW_NUMBER(),语法更简洁规范,而且Apache Spark SQL完全兼容该语法,非常适合后续迁移需求:
SELECT ROW_NUMBER() OVER () as row_number, t.* FROM myTable t
如果需要按照特定列的顺序生成行号,可以在OVER()中添加ORDER BY子句,比如按id列升序排列:
SELECT ROW_NUMBER() OVER (ORDER BY id ASC) as row_number, t.* FROM myTable t
说明
变量赋值的写法是MySQL旧版本的兼容方案,8.0之后官方更推荐使用窗口函数——不仅语法清晰易维护,还能避免变量带来的潜在逻辑问题,同时完美适配Spark SQL的语法规则,减少后续迁移的修改成本。
内容的提问来源于stack exchange,提问作者Harikrishnan Balachandran
相关产品推荐
相关产品推荐

