Как выбрать и обновить запись одновременно в mySQL?

Есть ли способ выбрать запись и обновить ее в одном запросе?

Я попробовал это:

UPDATE arrc_Voucher 
  SET ActivatedDT = now() 
WHERE (SELECT VoucherNbr, VoucherID
         FROM arrc_Voucher
        WHERE ActivatedDT IS NULL
          AND BalanceInit IS NULL
          AND TypeFlag = 'V'
        LIMIT 1 )

я надеялся, что запустит запрос на выборку и получит первую запись, которая соответствует предложению where, обновит поле ActivatedDT в этой записи, но я получил следующую ошибку:

1241 - операнд должен содержать 1 столбец (столбцы)

Есть идеи?

2 ответа

Как насчет:

UPDATE arrc_Voucher 
  SET ActivatedDT = NOW() 
WHERE ActivatedDT IS NULL
  AND BalanceInit IS NULL
  AND TypeFlag = 'V'
LIMIT 1;

Из документации MySQL API:

UPDATE возвращает количество строк, которые были фактически изменены

Вы не можете выбрать строку и обновить ее одновременно, вам потребуется выполнить два запроса для ее достижения; получить вашу запись, а затем обновить ее.

Если вы беспокоитесь о параллельных процессах, обращающихся к одной и той же строке через какое-либо условие гонки (предположим, что ваш сценарий использования связан с большим трафиком), вы можете рассмотреть другие альтернативы, такие как блокировка таблицы (обратите внимание, что другим процессам потребуется восстановление - повторите попытку). -если таблица заблокирована при доступе к ней)

Или, если вы можете создать хранимую процедуру, вы можете прочитать эту статью или документацию по MySQL API.

Но в 99% случаев это не обязательно, и два запроса будут выполняться без проблем.

Другие вопросы по тегам