2012-02-13 23 views
5

karşı INTO INTO INTO INTO, bir sorun var, gerçekten bir sorun var.INSERT [INT]

Veritabanımda oldukça küçük, yalnızca 3 sütun var ama büyüme potansiyeli olan bir tablo var. Sorunumda iki çözüm var, ancak neden birini veya diğerini kullanacağından emin değilim.

Veritabanında zaten bulunmayan veya bulunmayan bir veri parçası var. Bunu çözmenin iki yolu. Benzersiz kimliğim var, kontrol etmek çok kolay. kayıtlar veritabanında mevcut ve eğer değilse

  1. Kontrol, INSERT INTO veritabanı
  2. Kullanım REPLACE INTO, zaten kimliğini var çünkü.

Şimdi sorum var. Hangisi daha iyidir? 2 sonuçtan birini kullanarak artıları ve eksileri nelerdir. Ya da daha iyi bir sonuç var mı?

Bir not, veriler tam olarak aynı, bu nedenle kayıt daha yeni bir değerle güncellenir. Böylece REPLACE INTO zaten var olan verileri ekleyecektir.

+10

Dikkat edin, 'INPLAY INTO 'dahili olarak bir' DELETE 've ardından bir INSERT olarak uygulanır. Sil, normal bir silidir, yani yabancı anahtarları kontrol eder ve 'ON DELETE' şartlarına uyur. * Muhtemelen * İstediğin gibi ... DUPLICATE ANAHTAR GÜNCELLEMESİNİ ... ... yine de istiyorum. – Charles

+0

Ama, burada en iyi uygulama nedir? Ve neden –

+2

Ayrıca, aynı (mevcut) değerlere sahip bir satırı güncellemeye çalışırsanız, MySQL değerlerin aynı olduğunu algılar ve güncellemeyi atlar, zaman tasarrufu, kilitler, vb .-- INSERT kullanmak için başka bir sebep INTO ... DUPLICATE ANAHTAR GÜNCELLEME ... 'önce var olan satırı silmeye karşı. –

cevap

10

REPLACE INTO burada önerilmez - gerçekten hiçbir şeyi değiştirmeniz gerekmez. Tüm sonuçlarıyla birlikte DELETE, ardından INSERT yapar. Örneğin, tüm dizinlerin güncellenmesi gerekir; bu, gereksiz bir şekilde işe yarar ve sık sık kullanırsanız dizine ayırma işlemine yol açar. Öte yandan

sayaçlar için ağırlıklı olarak kullanılmaktadır ON DUPLICATE KEY UPDATE vardır, ancak artışlarla ya da başka herhangi bir değer değişiklikleri ile satırınızın güncellenmiyor, bu yüzden benzer SET id=id falan gibi garip sözdizimi kullanmak gerekir.

kayıt sizin için en iyi çözüm olacağı veritabanında varsa kontrol edilmesi, ancak bunun yerine başka bir sorgu kullanarak MySQL size ve kullanıma check-yapalım:

`INSERT IGNORE INTO ...` 

Bu şekilde eklemeye çalışırsanız Yinelenen benzersiz veya birincil anahtar ile herhangi bir satır herhangi bir hata oluşturmadan sadece eklenmeyecektir. Muhtemelen eksik olan diğer hata mesajlarının yan etkilerini not edin, ancak ne eklediğini tam olarak biliyorsanız, iyi olmalısınız.