Как выбрать и обновить запись одновременно в mySQL? - PullRequest
2 голосов
/ 28 октября 2010

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

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

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 )

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

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

Есть идеи?

Ответы [ 2 ]

3 голосов
/ 28 октября 2010

Как насчет:

UPDATE arrc_Voucher 
  SET ActivatedDT = NOW() 
WHERE ActivatedDT IS NULL
  AND BalanceInit IS NULL
  AND TypeFlag = 'V'
LIMIT 1;
0 голосов
/ 28 октября 2010

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

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...