ВСТАВКА НА ДУБЛИКАТ. КЛЮЧЕВОЕ ОБНОВЛЕНИЕ - это то, что вам нужно. В сочетании с предварительно выбранным stock_quantity. Вам нужно сделать item_id PRIMARY KEY .
Теперь, конечно, вы будете использовать один оператор SELECT и один оператор INSERT INTO с PHP (я полагаю) переменными.
SELECT @stock_quantity:=stock_quantity FROM warehouse_item_mapping WHERE item_id=123;
INSERT INTO warehouse_item_mapping (warehouse_id, item_id, stock_quantity)
VALUES (1, 123, 50)
ON DUPLICATE KEY UPDATE warehouse_id=1, stock_quantity=@stock_quantity+50;
Рабочий пример: db-fiddle
РЕЗУЛЬТАТ:
Results
Query #1 Execution time: 0ms
warehouse_id item_id stock_quantity
1 123 60
1 234 70
1 345 30
1 678 50
ТАК ЛАТ говорит, что вы используете PHP:
PHP:
'$item_id' // your new OR old inserting item id.
'$warehouse_id'
'$stock_quantity' // Your NEW stock number.
START TRANSACTION;
SELECT @stock_quantity:=stock_quantity
FROM warehouse_item_mapping WHERE item_id='$item_id';
INSERT INTO warehouse_item_mapping (warehouse_id, item_id, stock_quantity)
VALUES ('$warehouse_id', '$item_id', '$stock_quantity')
ON DUPLICATE KEY UPDATE warehouse_id='$warehouse_id', stock_quantity=@stock_quantity+'$stock_quantity';
COMMIT;
Это попытается вставить значение, только если идентификатор элемента PRIMARY KEY не существует. Если это произойдет, он обновит два других поля.
РЕДАКТИРОВАТЬ:
Я думаю, вы не понимаете, что такое транзакция @, читайте об этом здесь . Выше приведен пример того, о чем вы просили, но это также можно сделать одним запросом, как указано в комментарии. Пример:
INSERT INTO warehouse_item_mapping (warehouse_id, item_id, stock_quantity)
VALUES (1, 123, 50) ON DUPLICATE KEY UPDATE
warehouse_id=1, stock_quantity=stock_quantity+50;
Рабочая скрипка.
PHP:
INSERT INTO warehouse_item_mapping (warehouse_id, item_id, stock_quantity)
VALUES ('$warehouse_id', '$item_id', '$stock_quantity') ON DUPLICATE KEY
UPDATE warehouse_id='$warehouse_id', stock_quantity=stock_quantity+'$stock_quantity';