INSERT ON DUPLICATE KEY UPDATE不能两次更新同一行

时间:2018-10-19 21:20:26

标签: 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_quantity) + '123',
    product_sales = VALUES(product_sales) + '1.5',
    product_desc = 'hello',
    insert_time = 'hello';

这是我的Create table语句:

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

这是表格的说明

| Field | Type | Null | Key | Default | Extra | +------------------+-------------+------+-----+---------+-------+ | product_code | varchar(20) | NO | PRI | | | | product_desc | longtext | YES | | NULL | | | product_quantity | bigint(20) | YES | | NULL | | | product_sales | float | YES | | NULL | | | product_group | varchar(20) | NO | PRI | | | | insert_time | varchar(40) | YES | | NULL |

这是问题所在,在我插入行之后,此查询仅更新数据库中的数据一次,这意味着在第一次更新后,数据将不再更新?

此sql有什么问题?

2 个答案:

答案 0 :(得分:0)

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

在第三次执行时,没有更改要应用。结果行将与已存储的行完全匹配。因此,MySQL报告0 row(s) affected,并且该行保持不变。

首次执行后:

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

第三次执行(以及第四,第五,...)之后:

------------ ------------ ---------------- ------------- ------------- ----------
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_quantity列的当前值。如果为null,则返回0,否则返回存储在行中的值。然后添加INSERT语句中为product_quantity提供的值。

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

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

我们正在猜测规格;猜测SQL应该做什么,我们想要实现什么行为。否则,我们将仅凭“尝试此” SQL而无法确定所提议的SQL是否满足规范。

答案 1 :(得分:0)

如果要继续向 product_quantity product_sales 列中添加值,这是您执行插入语句的方法,首先删除 VALUES()< / strong>方法,第二个(可能是可选的)用于跳过自动转换引擎类型,在 SUM 上使用整数和浮点数。

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()解释:

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