Как выполнить запрос на обновление в MySQL на CTE? - PullRequest
0 голосов
/ 16 июня 2020

Я пытаюсь создать CTE, который, как мне кажется, работает нормально. Тем не менее, я хочу затем запустить запрос на обновление этого CTE, но я продолжаю получать следующую ошибку в MySQL WorkBench,

"Error Code: 1288. The target table pptest of the UPDATE is not updatable"

Я осмотрелся, но ничего не понимаю в работе вокруг и вдобавок ко всему, я тоже не слишком разбираюсь в своем MySQL. Моя цель состояла в том, чтобы создать таблицу / представление с кучей записей, которые были разделены и имели бы номер индекса в каждой строке, который будет представлен "row_num". Это было сделано для того, чтобы сгруппировать дублированные данные в таблице вместе, а затем я надеялся просто запустить запрос на обновление для этой структуры, где row_num был больше 1. Так просто logi c, но я не могу найти другого способа достижения своей цели . Может ли кто-нибудь помочь с этим, пожалуйста?

Полный запрос, который я выполнял ранее, был:

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

1 Ответ

1 голос
/ 16 июня 2020

Этот синтаксис не поддерживается в MySQL. На самом деле это выглядит как SQL Синтаксис сервера ... Вы не можете просто переносить запросы из одной базы данных в другую и ожидать, что они будут работать.

В 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

...