MySQL select данных и update одного поля на эти данные

У меня есть SELECT запрос, которым я получаю данные и с ними работаю в PHP:

SELECT addr, appid, failedquery 
FROM servers 
WHERE lastupdate+900 < 'текущее время' 
  AND isupdating = 0 
ORDER BY lastupdate LIMIT 10;

И мне нужно в этих выбранных данных изменить поле isupdating на 1, то есть что сервера находятся на обновлении. Я бы мог конечно сделать в самом php перебор этих данных и по уникальному полю делать:

UPDATE servers 
SET isupdating = 1 
WHERE addr = 'addr из select запроса'

и так на каждую строчку. Но если будет LIMIT не 10, а скажем 10000 - и на каждую строку самому из PHP кидать 10000 запросов UPDATE не очень хорошо.

Так вот вопрос, могу ли я получить данные SELECT'ом и тут же при этом обновить одно поле во всех этих выбранных данных в одном запросе? Наверняка есть какие-то ухищрения. Спасибо.


Ответы (1 шт):

Автор решения: Akina
SELECT addr, appid, failedquery 
FROM servers
WHERE isupdating = 0
  AND lastupdate < CURRENT_TIMESTAMP - INTERVAL 900 SECOND;

и соответственно

UPDATE servers
SET isupdating = 1
WHERE isupdating = 0
  AND lastupdate < CURRENT_TIMESTAMP - INTERVAL 900 SECOND;

CURRENT_TIMESTAMP - INTERVAL 900 SECOND - это константа, которая вычислится один раз (причём ещё на этапе построения плана выполнения), и запрос может использовать индекс по полю lastupdate. Тогда как показанный в тексте вопроса запрос индекс использовать не может, и выполнит полный скан таблицы, что очевидно будет медленнее.


могу ли я получить данные SELECT'ом и тут же при этом обновить одно поле во всех этих выбранных данных в одном запросе?

Нет.

→ Ссылка