我正在尝试在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有什么问题?
答案 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的值。此功能在多行插入中特别有用。