В таблице строки сгенерированы изначально (список пин-кодов) и далее только обновляются два поля: статус status (с 0 на 1 и обратно) и поле номер заказа ord_id, для продажи одного или нескольких пин-кодов делаю банальный апдейт, а для продажи нескольких пин-кодов с определенными ID (подряд идущая серия) в одном заказе делаю так:
UPDATE pin_codes SET status=1, ord_id=223344 WHERE status=0 AND (id BETWEEN 300 AND 345)
Если все запрошенные пин-коды уже проданы (статус=1), то обновления не произойдет, все ок.
Если все запрошенные пин-коды свободны, то тоже все ок - произойдет апдейт как положено.
Вопрос: как запретить апдейт, если часть из запрашиваемого интервала пин-кодов уже продана, то есть по сути обновится только часть строк.
Смысл в том, что продажа по сериям, но разные клиенты выбирают разные серии, для кого-то подходит серия от 300 до 345, для кого-то от 300 до 400, для кого-то от 320 до 350 и так далее и обязательно полнота серии.
Шальную мысль сначала делать select и затем по результатам update сразу выкинул....
То есть если упрощенно, то разрешать делать апдейт только при полном выполнений всех условий
Используйте подзапрос для проверки:
UPDATE pin_codes SET status=1, ord_id=223344
WHERE not exists
(select 1 from
(select * from pin_codes
where (id between 300 and 345) and status=1
) a
)
AND (id BETWEEN 300 AND 345)
http://sqlfiddle.com/#!9/ee4d9/1
UPD. В MySql нужно слегка костылить, поправил ответ.
Сложно мне изменить класс, опыта малоКак бы добавить в Medoo возможность обновлять данные через ON DUPLICATE KEY UPDATE