134

一意のキーがすでに存在する場合、多くの列のほとんどを新しい値に更新する必要がある挿入クエリを実行しています。これは次のようになります。

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句から現在の行を参照するにはどうすればよいですか?

4

4 に答える 4

203

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, ...
于 2010-03-18T18:15:00.147 に答える
60

私はこれに非常に遅れていますが、句INSERT-SELECT付きのクエリを使用したい人のためのいくつかの正当な質問を見た後GROUP BY、私はこれの回避策を思いつきました。

マーカス・アダムスの答えをさらに取り上げて、その中で会計処理GROUP BYします。これは、私が使用して問題を解決する方法です。Subqueries in the FROM Clause

INSERT INTO lee(exp_id, created_by, location, animal, starttime, endtime, entct, 
                inact, inadur, inadist, 
                smlct, smldur, smldist, 
                larct, lardur, lardist, 
                emptyct, emptydur)
SELECT sb.id, uid, sb.location, sb.animal, sb.starttime, sb.endtime, sb.entct, 
       sb.inact, sb.inadur, sb.inadist, 
       sb.smlct, sb.smldur, sb.smldist, 
       sb.larct, sb.lardur, sb.lardist, 
       sb.emptyct, sb.emptydur
FROM
(SELECT id, uid, location, animal, starttime, endtime, entct, 
       inact, inadur, inadist, 
       smlct, smldur, smldist, 
       larct, lardur, lardist, 
       emptyct, emptydur 
FROM tmp WHERE uid=x
GROUP BY location) as sb
ON DUPLICATE KEY UPDATE entct=sb.entct, inact=sb.inact, ...
于 2015-04-16T08:08:41.520 に答える
0

SELECTステートメントにGROUPBY句がある場合。

    ....
    ON DUPLICATE KEY UPDATE    
    larct=VALUES(larct), lardur=VALUES(lardur),lardist= 
    VALUES(lardist)
于 2021-06-02T10:50:13.970 に答える
0

ON DUPLICATE KEY UPDATE a=VALUES(a), b=VALUES(b)フィールドの名前が異なるON DUPLICATE KEY UPDATE a=VALUES(c), b=VALUES(c)場合、たとえば失敗する場合などは機能しませんが、ON DUPLICATE KEY UPDATE a=t.c, b=t.c...機能します。

于 2021-12-15T06:52:20.470 に答える