ŞUNUNA EKLEYİN… ÇİFT ANAHTAR GÜNCELLEME ÜZERİNDEN… ŞUNDAN SEÇİN


116

Zaten benzersiz bir anahtar varsa, birçok sütunun çoğunun yeni değerlerle güncellenmesi gereken bir ekleme sorgusu yapıyorum. Şöyle bir şey oluyor:

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

UPDATEMaddenin sözdiziminin ne olması gerektiğinden emin değilim . Cümleden geçerli satıra nasıl başvurabilirim SELECT?

Yanıtlar:


172

MySQL, eşittir INSERT INTO yan tümcesinde belirtilen sütunlara başvurmadan önceki bölümü varsayar ve ikinci bölüm SELECT sütunlarına başvurur.

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, ...

6
@dnagirl: İPUCU: PK sütunlarından herhangi birini güncellemeye çalışmayın, yalnızca güncellenmesi
gerekenler

45
Önerilen sözdiziminiz çalışıyor ve t.gerekli. Ayrıca xaprb (bir makale buldum xaprb.com/blog/2006/02/21/flexible-insert-and-update-in-mysql bu sözdizimini kullanır): on duplicate key update b = values(b), c = values(c). Bu da işe yarar.
dnagirl

9
Not: Bu, SELECT deyiminin GROUP BY cümlesi
içerdiğinde çalışmayacaktır

11
@john SELECT ifadesinde GROUP BY cümlesi varsa ne yapmalı
Kathir

2
dev.mysql.com/doc/refman/5.6/en/insert-on-duplicate.html , `` MySQL 5.6.4 ve sonraki sürümlerinde, INSERT ... SELECT ON DUPLICATE ANAHTAR GÜNCELLEME deyimleri, ifade tabanlı çoğaltma için güvenli değil olarak işaretlendi ... Ayrıca, MySQL 5.6.6, bir INSERT ile başlayan ... birden fazla benzersiz veya birincil anahtar olan bir tabloya karşı AÇIK yİNELENEN KEY UPDATE deyimi de unsafe.` olarak işaretlenmiş
Abdul Muneer

51

Buna çok geç kalmama rağmen , INSERT-SELECTsorguyu GROUP BYcümle ile kullanmak isteyenler için bazı meşru sorular gördükten sonra , bunun için çalışma etrafında döndüm.

Marcus Adams'ın cevabını ve içindeki muhasebeyi daha ileriye GROUP BYgötürürsek, sorunu bu şekilde çözerdim.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, ...

8
Bu COUNT, GROUP vb. Sorgular için doğru cevaptır. Teşekkürler.
Kostanos

Çok teşekkür ederim ahbap! Bu yaklaşımı gerçekten beğendim, çünkü InfluxDB'nin yaptığı bir şey olan Continuous Query gibi bir mekanizma oluşturmama izin verdiği için.
Miere

1
Ayrıca yinelenen güncellemede, stackoverflow.com/questions/16935896/…
Erik Melkersson
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.