В настоящее время у нас есть PHP-код, который позволяет конечным пользователям обновлять записи в нашей базе данных, заполняя несколько полей формы. В базе данных есть поле, называемое sequentialNumber, и пользователь может ввести начальный номер и конечный номер, а запрос обновления выполняется в фоновом режиме для всех записей с последовательным номером между начальным и конечным номерами. Это довольно быстрый запрос.
В последнее время мы сталкиваемся с некоторыми проблемами, когда люди пытаются обновить записи, которые не существуют. Теперь это не проблема в конце базы данных, но они хотят получать уведомления, если записи не существуют, и если да, то какие из них не существуют.
Единственный способ, которым я могу это сделать, - запустить запрос select в цикле:
for ($i=$startNum; $i<=$endNum; $i++) {
//run select query: select sequentialNumber from myTable where sequentialNumber = $startNum;
}
Проблема в том, что наш общий хост имеет ограничение на тайм-аут для скриптов, и если пакет sequentialNumber достаточно велик, script отключится. Есть ли лучший способ проверить наличие записей перед запуском запроса на обновление?
EDIT: Мне просто пришло в голову, что я могу сделать еще один тест: получить количество записей, которые они пытаются обновить ($ endNum - $startNum), а затем выполнить запрос на подсчет:
select count(sequentialNumber) where sequentialNumber between $startNum and $endNum
Если результат запроса не совпадает с значением вычитания, то мы знаем, что всех записей нет. Он не сможет сказать нам, КОТОРЫЕ их нет, но, по крайней мере, мы знали бы, что что-то не так, как ожидалось. Действительно ли это способ сделать что-то?
Вы можете попробовать
select sequentialNumber from myTable where sequentialNumber between $startNum and $endNum
Это вернет все известные номера в этом диапазоне. Затем вы можете использовать функцию array_search, чтобы узнать, известен ли определенный номер или нет. Это должно быть быстрее, чем выполнение большого количества запросов к db.
var count = mysql_fetch_array(mysql_query('SELECT count(*) FROM x WHERE id>startNum and id<endNum'));
var modified = mysql_affected_rows(mysql_query('UPDATE x SET col='value' WHERE id>startNum and id<endNum'));
if (count[0] > modified) {
// panic now
}