Mysql 在重复键更新列中使用WHERE子句
这是cartitems表的表设计 购物车项目Mysql 在重复键更新列中使用WHERE子句,mysql,sql,Mysql,Sql,这是cartitems表的表设计 购物车项目 cartitem_id PK AI customer_id FK item_id FK UNIQUE item_quantity INT DEFAULT 1 我需要完成的事情 1.)如果表中存在item\u id,则每次用户单击相同的item\u id的“添加到购物车”按钮时,将item\u数量增加 2.)如果表中尚不存在item_id,请运行insert语句 所以我做的就是这个 CREATE DEFINER=`root`@`localhost`
cartitem_id PK AI
customer_id FK
item_id FK UNIQUE
item_quantity INT DEFAULT 1
我需要完成的事情
1.)如果表中存在item\u id
,则每次用户单击相同的item\u id
的“添加到购物车”按钮时,将item\u数量增加
2.)如果表中尚不存在item_id
,请运行insert语句
所以我做的就是这个
CREATE DEFINER=`root`@`localhost` PROCEDURE `addItemToCart`(aCustomerId int, aProductId int)
BEGIN
INSERT INTO cart_items(customer_id,product_id)
VALUES(aCustomerId,aProductId)
ON DUPLICATE KEY UPDATE
item_quantity = item_quantity + 1
WHERE customer_id = aCustomerId AND item_id = aProductId;
END
但是当我检查它时,我得到一个错误,在item\u quantity=item\u quantity+1
我想不出是什么导致了这个错误。我不知道这是否是WHERE
子句的问题
我非常感谢你的帮助
谢谢。重复密钥更新时的行为在以下内容中得到了很好的解释:
如果指定了ON DUPLICATE KEY UPDATE,并且插入了一行,这将导致在唯一索引或主键中出现重复值,MySQL将执行旧行的更新
查看表,您希望增加给定客户购物车的商品数量。我在这里假设一个客户一次可能只有一辆购物车。因此,希望MySQL执行更新
而不是插入
的条件是,客户和项目已经出现在表中
为此,您可以通过以下方式在这两列上创建唯一索引:
CREATE UNIQUE INDEX unq_item_index ON cart_items (customer_id, item_id);
然后,您可以使用以下INSERT
查询:
INSERT INTO cart_items (customer_id, item_id)
VALUES
(aCustomerId, anItemId)
ON DUPLICATE KEY UPDATE
item_quantity = item_quantity + 1
WHERE customer_id = aCustomerId AND
item_id = anItemId;
现在的行为是,如果客户/项目的新条目进入,则项目数量
将设置为默认值1
,否则项目数量
将增加1重复键更新时的行为在以下章节中得到了很好的解释:
BEGIN
IF NOT EXISTS(SELECT 1 FROM cart_items WHERE item_id = aProductId)
BEGIN
INSERT INTO cart_items(customer_id,product_id)
VALUES(aCustomerId,aProductId)
END
ELSE
UPDATE cart_items SET item_quantity = item_quantity + 1 WHERE customer_id = aCustomerId AND item_id = aProductId;
END
如果指定了ON DUPLICATE KEY UPDATE,并且插入了一行,这将导致在唯一索引或主键中出现重复值,MySQL将执行旧行的更新
查看表,您希望增加给定客户购物车的商品数量。我在这里假设一个客户一次可能只有一辆购物车。因此,希望MySQL执行更新
而不是插入
的条件是,客户和项目已经出现在表中
为此,您可以通过以下方式在这两列上创建唯一索引:
CREATE UNIQUE INDEX unq_item_index ON cart_items (customer_id, item_id);
然后,您可以使用以下INSERT
查询:
INSERT INTO cart_items (customer_id, item_id)
VALUES
(aCustomerId, anItemId)
ON DUPLICATE KEY UPDATE
item_quantity = item_quantity + 1
WHERE customer_id = aCustomerId AND
item_id = anItemId;
现在的行为是,如果新的客户/项目条目进入,item\u数量
将被设置为默认值1
,否则item\u数量
将增加1为什么要在那里使用WHERE
子句?这没有道理。如果发生重复键
,它将更新您为具有相同键的旧记录指定的任何字段。所以,如果您只是删除WHERE
子句,它应该可以工作。检查。它指出了以下两个方面:
BEGIN
IF NOT EXISTS(SELECT 1 FROM cart_items WHERE item_id = aProductId)
BEGIN
INSERT INTO cart_items(customer_id,product_id)
VALUES(aCustomerId,aProductId)
END
ELSE
UPDATE cart_items SET item_quantity = item_quantity + 1 WHERE customer_id = aCustomerId AND item_id = aProductId;
END
INSERT INTO table (a,b,c) VALUES (1,2,3)
ON DUPLICATE KEY UPDATE c=c+1;
UPDATE table SET c=c+1 WHERE a=1;
都是一样的。为什么要在那里使用WHERE
子句?这没有道理。如果发生重复键
,它将更新您为具有相同键的旧记录指定的任何字段。所以,如果您只是删除WHERE
子句,它应该可以工作。检查。它指出了以下两个方面:
INSERT INTO table (a,b,c) VALUES (1,2,3)
ON DUPLICATE KEY UPDATE c=c+1;
UPDATE table SET c=c+1 WHERE a=1;
都是一样的。我有一个实例,其中我还更新了编辑器和编辑日期,但我只希望实际值在更改时更新,因此我还需要说“仅在这些特定值更改时更新”。我有一个实例,其中我还更新了编辑器和编辑日期,但我只希望实际值在更改时更新,所以我还需要说“仅在这些特定值更改时更新”