Mysql DOES позволяет вам иметь уникальные индексы, а INSERT ... ON DUPLICATE UPDATE выполнит обновление, если какой-либо уникальный индекс имеет дубликат, а не только PK.
Тем не менее, я бы, вероятно, все равно выбрал подход "два запроса". Вы делаете это в транзакции, верно?
- сделать обновление
- Проверьте затронутые строки, если это 0, тогда вставьте
OR
- Попытка вставки
- Если произошел сбой из-за нарушения уникального индекса, выполните обновление (NB. Вы захотите проверить код ошибки, чтобы убедиться, что он не вышел из строя по какой-либо другой причине)
Первый вариант хорош, если строка обычно уже существует, но может вызвать состояние гонки (или тупика), если вы делаете это вне транзакции или если ваш режим изоляции недостаточно высок.
Создание уникального индекса для item_number в вашей таблице инвентаря звучит для меня хорошей идеей, потому что я представляю (не зная деталей вашей схемы), что один элемент должен иметь только один уровень запасов (при условии, что ваша система не разрешить наличие нескольких складов и т. д.).