Как запретить UPDATE если не совпали интервалы?

340
26 ноября 2016, 20:24

В таблице строки сгенерированы изначально (список пин-кодов) и далее только обновляются два поля: статус 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 сразу выкинул....
То есть если упрощенно, то разрешать делать апдейт только при полном выполнений всех условий

Answer 1

Используйте подзапрос для проверки:

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 нужно слегка костылить, поправил ответ.

READ ALSO
ON DUPLICATE KEY UPDATE в Medoo.in

ON DUPLICATE KEY UPDATE в Medoo.in

Сложно мне изменить класс, опыта малоКак бы добавить в Medoo возможность обновлять данные через ON DUPLICATE KEY UPDATE

462
Не могу создать триггер

Не могу создать триггер

Добрый деньЕсть таблица:

256
многострочный INSERT

многострочный INSERT

Есть некоторый массив данных:

364