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