Обновление поля, на котором основан цикл запроса Select - PullRequest
0 голосов
/ 14 марта 2019

Это грубый пример моего запроса MySQL (примечание: это внутри другого цикла, который проходит через всех пользователей):

$query = db.query('SELECT * FROM table WHERE userid = $uid AND reminded = 0');

while ($row = $query->fetch()) {
  // send personalized reminder email to the user
  db.query('UPDATE table SET reminded = 1 WHERE userid = $uid');
}

Поле reminded установлено в 1 для всех случаев дляэтого пользователя.

Мой вопрос: загружен ли запрос / while (fetch) в память на основе исходных терминов (reminded = 0), или будет ли оставшийся цикл while вести себя в соответствии с этими обновлениями (reminded = 1)?

Допустим, у пользователя было 50 строк, где reminded равно 0, и запрос выбирает их: они все еще существуют со значением 0 в оставшейся части цикла while, хотя все они были изменены1 во время цикла?

1 Ответ

1 голос
/ 14 марта 2019

Предполагая, что код и SQL у вас есть только пример (потому что вы должны обновлять напрямую без цикла php).

Выборка в строках table выполняется в БД построчно.

Таким образом, если одна или несколько из этих строк обновляются в цикле while, на следующих итерациях вы будете извлекать и обновлять (снова) предыдущие обновленные строки.

Я думаю, что вы должны быть осторожны «только», если вы обновляете поле, которое является частью индекса, или поле, которое используется в SQL для извлечения данных (например, поле, используемое в ORDER BY, и др.).

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