Как сделать insert в базу при выполнении определенного условия?
Есть такая проблема, что с мобильного приложения на бэкенд может прийти сразу серия однотипных запросов к API, например, на добавление заказа.
При этом на бэкенде как-то нужно понять, что по факту это один и тот же заказ и сделать только один insert в таблицу с заказами. Но также должна остаться возможность принять такой же заказ по прошествии определенного времени (например, через час).
То есть нужно гарантировать, что insert будет выполнен только при условии, что за последний час подобных insert-ов не было.
Вариант делать перед insert-ом select (в котором проверять это условие) не подходит. Так как серия select-ов выполняется моментально, условие выполняется и затем все равно идет серия insert-ов.
Подскажите, как правильно реализовать это с помощью MySQL?
Если правильно, то никак. Это логика предметной области, бд не должна этим заниматься. Если клиент заказал бутылку воды, а через пять мин решил, что одной мало и решил заказать еще одну, то по Вашей логике, заказ не будет принят. Такие вещи решаются на уровне колцентров.
Если же Вы хотите защититься от спама заказов, то это всеравно не решатся уровнем бд. Это настройки Ваших серверов и работников бэкенда, по ip или по логину ограничивается количество заказов в минуту.
Вообще уже достаточно давно люди придумали транзакции. В данном случае нормальным вариантом было бы обращение к хранимой процедуре, которая в рамках транзакции произведет проверки и сделает или не сделает инсерт.
как уже заметил eRKa это логика уровня приложения, и к бд прямого отношения не имеет. Проверка должна выполняться в серверном приложении, и как верно предложил dollar - сначала селект - по результату инсерт.
Вариант делать перед insert-ом select (в котором проверять это условие) не подходит. Так как серия select-ов выполняется моментально, условие выполняется и затем все равно идет серия insert-ов.
Ошибка на фразе "срия select-ов выполняется моментально". Каждый селект будет выполняться ПОСЛЕДОВАТЕЛЬНО, при условии лока таблиц на чтение для инсерта. И ничего не выполнится моментально, все будет по порядку.