Использование `limit` с запросом обновления sql - PullRequest
0 голосов
/ 04 августа 2020

У меня есть следующий запрос, в котором я хочу ограничить количество обновляемых строк для таблицы subs. Однако он продолжает выявлять ошибку, где я ошибаюсь?

UPDATE subs t1
        INNER JOIN imp_subscriptionlog t2 
             ON t1.subscription_id = t2.subscription_id
SET t1.cancellation_date = t2.date

WHERE t2.event = 'subscription_cancelled'
LIMIT 35

Это ошибка:

Неправильное использование UPDATE и LIMIT

Код ошибки 1221.

Ответы [ 2 ]

0 голосов
/ 04 августа 2020

Обновить sub1

Внутреннее соединение (

      //your select statement another table
      

      //condition

      //Now use limit
       Limit 10
      )
     On 
      sub.data = table.date
      set 
0 голосов
/ 04 августа 2020

LIMIT допускается только при обновлении одной таблицы, как объяснено в документации :

Для синтаксиса одной таблицы, [...] если ORDER BY, строки обновляются в указанном порядке. Предложение LIMIT устанавливает ограничение на количество строк, которые могут быть обновлены.

Для синтаксиса с несколькими таблицами нельзя использовать ORDER BY и LIMIT.

Вы можете переписать запрос, чтобы использовать коррелированный подзапрос вместо соединения:

update subs
set cancellation_date = (
    select t2.date
    from imp_subscriptionlog t2 
    where t2.subscription_id = subs.subscription_id and t2.event = 'subscription_cancelled'
)
order by ???
limit 35

Примечания:

  • вы должны указать в запросе предложение order by , в противном случае не определено, какие строки будут фактически обновлены

  • запрос неявно предполагает, что всегда есть только одна соответствующая строка в imp_subscriptionlog для каждой строки в subs; если это не так, тогда вы должны также order by и limit 1 в подзапросе или использовать агрегирование

  • , мы также можем убедиться, что есть совпадение перед обновлением, добавив предложение where к запросу

Вот «более безопасная» версия запроса, которая обновляется до максимального значения даты, доступного в другой таблице, но не изменяет строки, которые имеют нет совпадений:

update subs
set cancellation_date = (
    select max(t2.date)
    from imp_subscriptionlog t2 
    where t2.subscription_id = subs.subscription_id and t2.event = 'subscription_cancelled'
)
where exists (
    select 1
    from imp_subscriptionlog t2 
    where t2.subscription_id = subs.subscription_id and t2.event = 'subscription_cancelled'
)
order by ???
limit 35
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...