如何在cte上运行mysql中的更新查询?

dxpyg8gm  于 2021-07-26  发布在  Java
关注(0)|答案(2)|浏览(468)

我正在尝试创建一个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
s6fujrry

s6fujrry1#

mysql不支持此语法。实际上这看起来像sql server语法。。。您不能仅仅将查询从一个数据库移植到另一个数据库并期望它们能够工作。
在mysql中,可以使用 update ... join 语法。但是,您需要一个主键列(或一组列)作为联接条件,该列唯一地标识每一行。假设那一列 id 是您的主键,即:

update db_name.table_name t
inner join (
    select id
    row_number() over (partition by col_a order by col_a) row_num 
    from db_name.table_name) 
) t1 on t1.id = t.id
set t.col_b = 'test' 
where t1.row_num > 1

旁注:
据我所知,您的查询意味着在 col_a . 但是你使用的方式 row_number() ,未定义将标记哪些重复行,因为 order by 从句是不确定的;你最好有一个 over() 条款如下: over (partition by col_a order by id) 窗口功能,如 row_number() 仅在mysql 8.0中可用

7z5jn7bk

7z5jn7bk2#

更新和删除在mysql临时表中不起作用。解决方法是将原始表与临时表cte连接起来,并更新原始表:

WITH cte as (select *, row_number() 
over (partition by col_a order by col_a) row_num 
from db_name.table_name) 

    update db_name.table_name T1 
Join 
cte on T1.col_a = cte.col_a set t1.col_b='test' where cte.row_num > 1

这也适用于删除指令。

相关问题