1. ホーム
  2. mysql

[解決済み] insert into ... select from ... on duplicate key update (重複キーで更新)

2022-06-21 03:21:46

質問

挿入クエリを実行していますが、ユニークキーがすでに存在している場合、多くのカラムのほとんどが新しい値に更新される必要があります。それは次のようなものです。

INSERT INTO lee(exp_id, created_by, 
                location, animal, 
                starttime, endtime, entct, 
                inact, inadur, inadist, 
                smlct, smldur, smldist, 
                larct, lardur, lardist, 
                emptyct, emptydur)
SELECT id, uid, t.location, t.animal, t.starttime, t.endtime, t.entct, 
       t.inact, t.inadur, t.inadist, 
       t.smlct, t.smldur, t.smldist, 
       t.larct, t.lardur, t.lardist, 
       t.emptyct, t.emptydur 
FROM tmp t WHERE uid=x
ON DUPLICATE KEY UPDATE ...; 
//update all fields to values from SELECT, 
//       except for exp_id, created_by, location, animal, 
//       starttime, endtime

の構文がよくわかりません。 UPDATE 句の構文がよくわかりません。現在の行を SELECT 節から現在の行を参照するにはどうしたらよいでしょうか。

どのように解決するのですか?

MySQL は、equals の前の部分が INSERT INTO 句で指定されたカラムを参照し、2 番目の部分が SELECT カラムを参照するものと見なします。

INSERT INTO lee(exp_id, created_by, location, animal, starttime, endtime, entct, 
                inact, inadur, inadist, 
                smlct, smldur, smldist, 
                larct, lardur, lardist, 
                emptyct, emptydur)
SELECT id, uid, t.location, t.animal, t.starttime, t.endtime, t.entct, 
       t.inact, t.inadur, t.inadist, 
       t.smlct, t.smldur, t.smldist, 
       t.larct, t.lardur, t.lardist, 
       t.emptyct, t.emptydur 
FROM tmp t WHERE uid=x
ON DUPLICATE KEY UPDATE entct=t.entct, inact=t.inact, ...