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

insert ... select単純に考えると、実行するのが aかかによって、構文が異なる可能性があります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、各行に対応する値」を意味します。これは宛先指向であるため、ソースが 1selectつまたは一連の定数タプルであるかどうかには依存しません。したがって、上記のクエリは次のように書き直されます。

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 に答える