Какой будет запрос вставки зависит от предыдущих данных в той же таблице? - PullRequest
1 голос
/ 22 апреля 2019

Я хочу вставить строку, если это одно конкретное значение столбца еще не доступно. Если доступно, я хочу обновить эту строку. В противном случае он будет вставлен нормально. Каким должен быть SQL-запрос для этой задачи?

Например: id, Product_id, user_id, количество являются атрибутами таблицы

Принимая во внимание, [1, 450, 56, 2] находится в табл.

Если я хочу вставить [2,450,56,3], то это не создаст новую строку. Это обновит предыдущий ряд. Как [1450,56,5].

Ответы [ 2 ]

0 голосов
/ 22 апреля 2019

Я бы начал с создания уникального ограничения на комбинацию product_id и user_id (или даже первичного ключа, если у вас его еще нет в таблице):

ALTER TABLE mytable
ADD CONSTRAINT uc_product_user UNIQUE (product_id, user_id);

И тогда вы можете использовать предложение on duplicate в выражении insert:

INSERT INTO mytable
VALUES (2, 450, 56, 3)
ON DUPLICATE KEY UPDATE quantity = quantity + VALUES(quantity);
0 голосов
/ 22 апреля 2019

Вы можете установить product_id и user_id в качестве первичного ключа или уникального ключа в таблице, а затем использовать INSERT .. ON DUPLICATE KEY UPDATE.Вы можете найти более подробную информацию об этом здесь .

Это будет выглядеть примерно так:

INSERT INTO t1 (id, product_id, user_id, quantity) VALUES (2,450,56,3)
  ON DUPLICATE KEY UPDATE quantity = quantity + 3;

В качестве альтернативы вам придется написать свой собственный merge оператор (MySql не поддерживает слияние, но вы можете его подделать)

DELIMITER $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_updateValue`(IN prm_productid INT, IN prm_userid INT, IN prm_quantity INT)
BEGIN


-- Check that the case actually exists first.

DECLARE vExists INT;

SELECT COUNT(1) INTO vExists FROM YourTable WHERE product_id = prm_orderid AND user_id = prm_userid;

IF vCaseExists = 1 THEN

    UPDATE YourTable SET quantity = prm_quantity WHERE product_id = prm_orderid AND user_id = prm_userid;

ELSE 
    INSERT INTO YourTable (id, product_id, user_id, quantity) VALUES (2,450,56,3);
END IF;

END$$
DELIMITER ;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...