Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.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 重复密钥更新时插入can';不更新同一行两次_Mysql_Database - Fatal编程技术网

Mysql 重复密钥更新时插入can';不更新同一行两次

Mysql 重复密钥更新时插入can';不更新同一行两次,mysql,database,Mysql,Database,我正在尝试在Mysql中使用sql INSERT INTO product_sales (product_code,product_desc,product_quantity,product_sales,product_group,insert_time) VALUES ('ZSHA','AAA','1','1.55','TESTING','$TEST time') ON DUPLICATE KEY UPDATE product_quantity = VALUES(product_q

我正在尝试在Mysql中使用sql

INSERT INTO product_sales (product_code,product_desc,product_quantity,product_sales,product_group,insert_time) 
VALUES ('ZSHA','AAA','1','1.55','TESTING','$TEST time')
ON DUPLICATE KEY UPDATE 
    product_quantity = VALUES(product_quantity) + '123',
    product_sales = VALUES(product_sales) + '1.5',
    product_desc = 'hello',
    insert_time = 'hello';
以下是我的CREATETABLE语句:

CREATE TABLE `product_sales` (
    `product_code` varchar(20) NOT NULL DEFAULT '',
    `product_desc` longtext,
    `product_quantity` bigint(20) DEFAULT NULL,
    `product_sales` float DEFAULT NULL,
    `product_group` varchar(20) NOT NULL DEFAULT '',
    `insert_time` varchar(40) DEFAULT NULL,
    PRIMARY KEY (`product_code`,`product_group`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
这是表格的说明

|字段|类型|空|键|默认|额外|
+------------------+-------------+------+-----+---------+-------+
|产品代码| varchar(20)|编号| PRI ||
|产品描述|长文本|是| |空||
|产品数量| bigint(20)|是| |空||
|产品销售|浮动|是| |空||
|产品组| varchar(20)| NO | PRI ||
|插入|时间| varchar(40)|是| |空|

问题是,在我插入行之后,这个查询只更新数据库中的数据一次,这意味着在第一次更新之后,数据不会再更新了


此sql有什么问题?

似乎工作正常。SQL似乎没有任何问题;它似乎正在执行指定的操作;我们观察到的行为与MySQL参考手册文档中的描述完全相同

第三次执行时,无需应用任何变更;结果行将与已存储的行完全匹配。因此MySQL报告受影响的
0行
,该行保持不变

第一次执行后:

product_code product_desc product_quantity product_sales product_group insert_time  
------------ ------------ ---------------- ------------- ------------- ----------
ZSHA         AAA                         1          1.55 TESTING       $TEST time   
------------ ------------ ---------------- ------------- ------------- ----------
ZSHA         hello                     124          3.05 TESTING       hello
第二次执行后:

product_code product_desc product_quantity product_sales product_group insert_time  
------------ ------------ ---------------- ------------- ------------- ----------
ZSHA         AAA                         1          1.55 TESTING       $TEST time   
------------ ------------ ---------------- ------------- ------------- ----------
ZSHA         hello                     124          3.05 TESTING       hello
第三次执行(第四次、第五次……)后:

这些结果正是我们所期望的。现在还不清楚为什么会有不同的期待。(可能我们不了解特殊的
VALUES()
函数的作用?)


这个问题让我们猜测。。。观察到什么行为,预期会出现什么行为。就解释而言,说它“不起作用”几乎毫无用处

如果要将VALUES子句中提供的值添加到列中的现有值

INSERT INTO ... ( ... , product_quantity , ... )
VALUES ( ... , '1' , ... )
ON DUPLICATE KEY 
UPDATE product_quantity = IFNULL(product_quantity,0) + VALUES(product_quantity) 
当出现重复键异常时,这将从行中获取
product\u quantity
列的当前值。如果为null,则返回0,否则返回存储在行中的值。然后将INSERT语句中提供的产品数量值添加到该值中

如果我们不希望NULL值覆盖列中的当前值,那么我们也可以将其包装在IFNULL或COALESCE中

... 
ON DUPLICATE KEY 
UPDATE product_quantity = IFNULL(product_quantity,0) + IFNULL(VALUES(product_quantity),0)

我们在猜测规格;猜测SQL应该做什么,我们想要实现什么行为。如果没有这一点,我们只是抛出“try this”SQL,而不确定所建议的SQL是否满足规范。

如果要继续向列product\u quantityproduct\u sales添加值,则必须先删除values()方法,第二(可能是可选的)对于跳过引擎上类型的自动转换,在和上使用整数和浮点数

INSERT INTO product_sales (product_code,product_desc,product_quantity,product_sales,product_group,insert_time) 
VALUES ('ZSHA','AAA','1','1.55','TESTING','$TEST time')
ON DUPLICATE KEY UPDATE 
    product_quantity = product_quantity + 123,
    product_sales = product_sales + 1.5,
    product_desc = 'hello',
    insert_time = 'hello';
接下来我将向您介绍VALUES()方法的含义,因为我认为您误解了它:

VALUES()解释:


在插入。。。在重复键UPDATE语句中,可以使用UPDATE子句中的VALUES(col_name)函数引用语句INSERT部分的列值。换句话说,UPDATE子句中的值(col_name)指的是在没有出现重复键冲突的情况下将插入的col_name的值。此函数在多行插入中特别有用。

您收到的错误消息是什么?尽量不要“引用”数值:
。。。产品数量=数值(产品数量)+123…
感谢您的回复,不幸的是,它仍然不能以这种方式工作。从我的角度来看,一切都正常-无论是否引用数值?为什么你认为它不起作用?我在我的终端上使用了相同的sql,但它不起作用。“不起作用”并没有描述观察到的行为。我们期望的行为是成功执行语句(没有错误,没有警告),MySQL报告“0行受影响”。这是我们期望观察到的行为,我们不会将这种行为描述为“不起作用”。我们根本不清楚到底观察到了什么样的行为。我希望不断增加产品数量和产品销售的价值,我不理解这条sql吗?当你再次输入同一条sql时,这些价值不会再增加了。在产品数量上增加一个常量值123似乎很奇怪(不合理)。更典型的用例是将新值添加到列中的现有值中。但是我们真的只是猜测,没有规范。是的,你是对的,但是看看这个例子周围所有的“测试”词,我认为这只是一个测试示例。没有规范,没有理解OP试图实现什么,我不会发布一个回答说“这就是你必须……”,不是没有理解OP想要实现什么,或者至少描述一下示例代码的设计目的。但是,我在阅读了他的评论后发布了我的答案:“我希望不断增加产品数量和产品销售的价值”。我什么都没猜到。。。不管怎样,如果我的回答让你感到不安,告诉我,我会删除它。