0

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

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`);

有没有办法做到这一点?

4

2 回答 2

1

天真地认为,他的语法可能会有所不同,具体取决于您是在执行 ainsert ... 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字段中输入的值,对于每一行,无论对应于什么。这是面向目标的,因此与源是一个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`);
于 2013-11-02T13:02:01.377 回答
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);
于 2013-11-02T12:13:36.473 回答