Как обновить и вставить в БД с помощью @transactional по запросу БД - PullRequest
0 голосов
/ 30 марта 2020

У меня есть одна таблица warehouse_item_mapping, имеющая столбцы - warehouseId, itemId, stockQuantity

   warehouse_id        item_id        stock_quantity
    1                   123              10
    1                   234              20
    1                   345              30 

Эта таблица используется для управления запасами в качестве текущего запаса товаров на складе.

Теперь, если новый запас пришел с некоторыми деталями, включая новые с текущим количеством запаса.

Как

 1    123       50
 1    234       50
 1    678       50 (new item)

Я должен обновить количество запаса в таблице как сумму существующего количества и текущего количества запаса. И если сопоставление не найдено в таблице, вставьте это новое сопоставление.

Для этого случая таблица должна быть обновлена ​​как

   warehouse_id        item_id        stock_quantity
    1                   123              60
    1                   234              70
    1                   345              30 
    1                   678              50

Как это сделать в одном запросе.

Продолжить вопрос в этом

   If someone used the current stock from table in between get and update query then how to maintain lock or transactional for whole flow.

1 Ответ

0 голосов
/ 31 марта 2020

ВСТАВКА НА ДУБЛИКАТ. КЛЮЧЕВОЕ ОБНОВЛЕНИЕ - это то, что вам нужно. В сочетании с предварительно выбранным 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';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...