1

所以我有这个查询

query =  "SET @rownumber = 0; UPDATE students SET roll_no = (@rownumber := @rownumber+1) WHERE standard='{}' AND division='{}' ORDER BY fname, lname".format(standard, division)

当我尝试使用 运行此查询cursor.execute(query)时,我收到以下错误

pymysql.err.ProgrammingError: (1064, "You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'UPDATE students SET roll_no = (@rownumber := @rownumber+1) WHERE standard='4' AN' at line 1")

但是当我在 MYSQL 工作台上运行它时,同样的查询可以正常工作吗?为什么它不工作,我怎样才能让它工作?

4

1 回答 1

1
UPDATE students 
SET roll_no = (@rownumber := @rownumber+1) 
WHERE standard='{}' 
  AND division='{}' 
  AND (1 + (@rownumber := 0))
ORDER BY fname, lname

怎么了?

执行计划生成器找到常量条件AND (1 + (@rownumber := 0))(它不包括任何列)并在查询执行之前对其进行一次评估,以便将其转换为常量。得到的值是 1,它被视为 TRUE 常数,所以这个条件被删除了。但是用户定义的变量在评估期间初始化。

此方法允许初始化变量和存储 ORDER BY 用法,因为它不会将查询转换为不允许 ORDER BY 子句的多表形式(如在子查询中初始化变量时)。

于 2020-05-22T11:52:51.970 回答