我正在使用此语句在重复键上插入或更新。
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`);
有没有办法实现这个目标?
答案 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);