在重复键时如何使用新值递增?

时间:2013-11-02 12:09:11

标签: mysql

我正在使用此语句在重复键上插入或更新。

INSERT INTO `tblrequests` (`request_user_id`, `request_rest_item_id`, `request_amount`) VALUES (select f1,f2,f3 from tbltmb)
 on duplicate key
 update `request_amount`=values(`request_amount`);

但我需要的是将当前原始字段更新为originalvalue + newvalue 像这样:

INSERT INTO `tblrequests` (`request_user_id`, `request_rest_item_id`, `request_amount`) VALUES (23, 7, 3)
 on duplicate key
 update `request_amount`=values(`old_request_amount` + `new_request_amount`);

有没有办法实现这个目标?

2 个答案:

答案 0 :(得分:1)

天真地想,他的语法可能会有所不同,具体取决于你是在做insert ... select还是insert ... values。但是在你读完之前不要做任何假设;)

insert ... select案例

这很容易。每个字段都有其独特的字段名称,可以在update表达式中使用,而mysql足够聪明,可以确定在插入多行时要更新的内容。

INSERT INTO `tblrequests` 
  (`request_user_id`, `request_rest_item_id`, `request_amount`) 
SELECT f1,f2,f3 from tbltmp
 on duplicate key
 update `request_amount`=`request_amount`+`f3`;

insert ... values案例

好吧,要插入一行,并且由于事先知道了相应的值,所以它应该是明确的:

INSERT INTO `tblrequests` 
  (`request_user_id`, `request_rest_item_id`, `request_amount`) 
VALUES (23, 7, 3)
 on duplicate key
 update `request_amount`=`request_amount`+3;

请参阅?我们只添加3,因为它是一个恒定的已知值。但是不要习惯那种语法!考虑一下:

INSERT INTO `tblrequests` 
  (`request_user_id`, `request_rest_item_id`, `request_amount`) 
VALUES (23, 7, 3),(35,10,23),(2,4,99)

虽然这些值是事先已知的,但我们应该添加的量不再是常量,因为插入的每一行都是不同的。

一般语法

幸运的是,有一个更通用的语法来涵盖所有情况:

on duplicate key
update request_amount=request_amount+values(request_amount);

values(request_amount)只是意味着“我想要放入request_amount字段的值,每行,对应的任何内容”。这是面向destionation,因此独立于源是select还是一系列常量元组。因此,上述查询将被重写为:

INSERT INTO `tblrequests` 
  (`request_user_id`, `request_rest_item_id`, `request_amount`) 
SELECT f1,f2,f3 from tbltmp
 on duplicate key
 update `request_amount`=`request_amount`+values(`request_amount`);

INSERT INTO `tblrequests` 
  (`request_user_id`, `request_rest_item_id`, `request_amount`) 
VALUES (23, 7, 3)
 on duplicate key
 update `request_amount`=`request_amount`+values(`request_amount`);

INSERT INTO `tblrequests` 
  (`request_user_id`, `request_rest_item_id`, `request_amount`) 
VALUES (23, 7, 3),(35,10,23),(2,4,99)
 on duplicate key
 update `request_amount`=`request_amount`+values(`request_amount`);

答案 1 :(得分:0)

只需添加列名+新值即可。

INSERT INTO `tblrequests` (`request_user_id`, `request_rest_item_id`, `request_amount`) VALUES (23, 7, 3)
 on duplicate key
 update `request_amount`=values(`request_amount` + 3);