MySql Tablo Ekleme yoksa güncelleyin


105
UPDATE AggregatedData SET datenum="734152.979166667", 
Timestamp="2010-01-14 23:30:00.000" WHERE datenum="734152.979166667";

Varsa çalışır datenum, ancak bu verileri yoksa yeni bir satır olarak eklemek istiyorum datenum.

GÜNCELLEME

datenum benzersizdir, ancak bu birincil anahtar değildir


2
"Datenum" benzersiz midir? Eğer öyleyse, INSERT ... ON DUPLICATE KEY UPDATE kullanabilirsiniz .
Jacob

Yanıtlar:


143

Jai, kullanmanız gerektiği konusunda haklı INSERT ... ON DUPLICATE KEY UPDATE.

Güncelleme yan tümcesine datenum eklemenize gerek olmadığını unutmayın, çünkü bu benzersiz anahtar olduğundan değişmemelidir. Tablonuzdaki diğer tüm sütunları eklemeniz gerekir. VALUES()Diğer sütunları güncellerken doğru değerlerin kullanıldığından emin olmak için işlevi kullanabilirsiniz .

İşte güncellemeniz INSERT ... ON DUPLICATE KEY UPDATEMySQL için uygun sözdizimi kullanılarak yeniden yazılmıştır :

INSERT INTO AggregatedData (datenum,Timestamp)
VALUES ("734152.979166667","2010-01-14 23:30:00.000")
ON DUPLICATE KEY UPDATE 
  Timestamp=VALUES(Timestamp)

18
INSERT ... ON DUPLICATE KEY UPDATE'i birden fazla benzersiz veya birincil anahtara sahip bir tabloya karşı tablolarda kullanırken dikkatli olun. Alındığı MySQL belgelerinde : ek olarak, MySQL 5.5.24, bir INSERT ile başlayan ... Birden fazla benzersiz veya birincil anahtar olan bir tabloya karşı AÇIK YİNELENEN KEY UPDATE deyimi de güvensiz olarak işaretlenir. (Hata # 11765650, Hata # 58637) Hata 58637 açıklaması bugs.mysql.com/bug.php?id=58637
geniş bant

1
Kullanarak UNIQUEkısıtlama oluşturmak gerekebilir TimestampALTER TABLE AggregatedData ADD UNIQUE (Timestamp)
Avyakt

@broadband, bu hatayı önlemek için bir bileşik anahtar kullanabilirsiniz
Kareem

16

Kullanmayı deneyin bu :

Eğer belirtirseniz ON DUPLICATE KEY UPDATEve eski satırın UNIQUE index orPRIMARY KEY , MySQL performs an [UPDATE`] ( http://dev.mysql.com/doc/refman/5.7/en/update.html ) içinde yinelenen bir değere neden olacak bir satır eklenir . ..

ON DUPLICATE KEY UPDATEBaba virgülle ayrılmış birden çok kolon atamaları içerebilir.

İle ON DUPLICATE KEY UPDATE, satır başına etkilenen satır değeri, satır yeni bir satır olarak eklenmişse 1, mevcut bir satır güncellenirse 2 ve mevcut bir satır geçerli değerlerine ayarlanmışsa 0 olur. Mysqld'ye bağlanırken CLIENT_FOUND_ROWSbayrağı belirtirseniz, etkilenen satırlar değeri 1'dir (0 değil), mevcut bir satır mevcut değerlerine ayarlanmışsa ...mysql_real_connect()


Ama benim veri birikimim birincil anahtar değil.
OHLÁLÁ

Benim durumumda çözüm nedir, bunu herhangi bir çözüm olmadan denedim: INSERT INTO forwind.aggregateddata (datenum, Timestamp, Min_F1_baro_20_) VALUES ('1', '2', '3') DUPLICATE ANAHTAR GÜNCELLEME datenum = datenum;
OHLÁLÁ

1
datenum benzersiz mi olmalı? evet ise, ona benzersiz bir dizin eklemek yerine (önceden eklenmemişse) O zaman çalışacaktır. EŞSİZ dizinlerin nasıl ekleneceğini öğrenmek için dev.mysql.com/doc/refman/5.1/en/alter-table.html adresine bakın
Jai

şimdi datenum'u benzersiz olarak tanımladım ve işe yarıyor, teşekkürler
OHLÁLÁ

1
Sadece bir bağlantı, belki bir cevap verin.
Andrew

0

UNIQUE kısıtlaması ayarlayamadığım iki alana (her iki yabancı anahtar) göre bir tabloyu güncellemem veya eklemem gereken bir durum yaşadım (bu nedenle INSERT ... ON DUPLICATE KEY UPDATE çalışmaz). İşte kullanmaya son verdiğim şey:

replace into last_recogs (id, hasher_id, hash_id, last_recog) 
  select l.* from 
    (select id, hasher_id, hash_id, [new_value] from last_recogs 
     where hasher_id in (select id from hashers where name=[hasher_name])
     and hash_id in (select id from hashes where name=[hash_name]) 
     union 
     select 0, m.id, h.id, [new_value] 
     from hashers m cross join hashes h 
     where m.name=[hasher_name] 
     and h.name=[hash_name]) l 
  limit 1;

Bu örnek, giriş parametreleri (iki ad ve bir sayı) [hasher_name], [hash_name] ve [new_value] ile değiştirilerek veritabanımın birinden alınmıştır. Yuvalanmış SELECT ... LIMIT 1, var olan kaydın veya yeni bir kaydın ilkini çeker (last_recogs.id bir otomatik artış birincil anahtardır) ve bunu REPLACE INTO'ya değer girişi olarak kullanır.


REPLACE her zaman yeni bir satır ekler! sadece orijinali, zaten mevcut olanı siler!
jasie
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.