天真地认为,他的语法可能会有所不同,具体取决于您是在执行 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`);