我正在尝试创建一个cte,我认为它工作得很好。但是,我想在这个cte上运行一个更新查询,但是我在mysql workbench中不断得到以下错误,
"Error Code: 1288. The target table pptest of the UPDATE is not updatable"
我环顾了一下四周,但没有不明白的工作周围的任何和最重要的是,我也不太喜欢我的mysql。我的目标基本上是创建一个表/视图,其中包含一组被分区的记录,并且每行上都有一个索引号,这个索引号用“row\u num”表示。这是将表中的重复数据分组在一起,然后我希望在行数大于1的结构上运行更新查询。这么简单的逻辑,但我不能想出任何其他方式来实现我的目标。有人能帮忙吗?
我之前的全部查询是,
WITH cte as (select *, row_number() over (partition by col_a order by col_a) row_num from db_name.table_name)
update cte set col_b='test' where row_num > 1
2条答案
按热度按时间s6fujrry1#
mysql不支持此语法。实际上这看起来像sql server语法。。。您不能仅仅将查询从一个数据库移植到另一个数据库并期望它们能够工作。
在mysql中,可以使用
update ... join
语法。但是,您需要一个主键列(或一组列)作为联接条件,该列唯一地标识每一行。假设那一列id
是您的主键,即:旁注:
据我所知,您的查询意味着在
col_a
. 但是你使用的方式row_number()
,未定义将标记哪些重复行,因为order by
从句是不确定的;你最好有一个over()
条款如下:over (partition by col_a order by id)
窗口功能,如row_number()
仅在mysql 8.0中可用7z5jn7bk2#
更新和删除在mysql临时表中不起作用。解决方法是将原始表与临时表cte连接起来,并更新原始表:
这也适用于删除指令。