Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 在重复键更新列中使用WHERE子句_Mysql_Sql - Fatal编程技术网

Mysql 在重复键更新列中使用WHERE子句

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`

这是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` 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;

都是一样的。

我有一个实例,其中我还更新了编辑器和编辑日期,但我只希望实际值在更改时更新,因此我还需要说“仅在这些特定值更改时更新”。我有一个实例,其中我还更新了编辑器和编辑日期,但我只希望实际值在更改时更新,所以我还需要说“仅在这些特定值更改时更新”