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 шт):
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'ом и тут же при этом обновить одно поле во всех этих выбранных данных в одном запросе?
Нет.