SORU
10 Temmuz 2009, Cuma


Eklemek, yinelenen PostgreSQL güncelleme?

Birkaç ay önce aşağıdaki sözdizimini kullanarak: MySQL birden çok güncelleştirme gerçekleştirme Yığın Taşması bir cevap aynı anda öğrendim

INSERT INTO table (id, field, field2) VALUES (1, A, X), (2, B, Y), (3, C, Z)
ON DUPLICATE KEY UPDATE field=VALUES(Col1), field2=VALUES(Col2);

Şimdi PostgreSQL geçiş yaptım ve görünüşe göre bu doğru değil. Farklı kelimeler kullanılıyor meselesi herhalde hepsi doğru tablolar atıfta bulunuyor ama bu işi nerede emin değilim.

Açıklığa kavuşturmak için, eklemek için ise onlar zaten güncelleme varsa birkaç şey istiyorum.

CEVAP
29 HAZİRAN 2011, ÇARŞAMBA


Uyarı: Bu, aynı anda birden fazla oturumları yürütülen güvenli değil(uyarılar kısmına bakınız).


Yapacak başka akıllıca bir yol bir "UPSERT" postgresql başarılı olması için tasarlanmıştır her veya etkisi olan UPDATE/INSERT iki sıralı açıklamaları yapmak.

UPDATE table SET field='C', field2='Z' WHERE id=3;
INSERT INTO table (id, field, field2)
       SELECT 3, 'C', 'Z'
       WHERE NOT EXISTS (SELECT 1 FROM table WHERE id=3);

GÜNCELLEME "id=3" zaten var, aksi takdirde hiçbir etkisi yoktur. bir satır varsa başarılı olur

EKLE "id=3" zaten yok. tek satır olursa başarılı olur

Tek bir dize içine bu ikisini birleştirmek ve tek bir SQL deyimi uygulama çalıştırmak hem de çalıştırabilirsiniz. Onları tek bir işlemle birlikte çalışan şiddetle tavsiye edilir.

Bu işleri çok iyi zaman çalıştırmak yalıtım ya da kilitli bir tablo, ama tabi yarış koşulları anlamına gelebilir yine de başarısız olan yinelenen anahtar hata eğer bir satır eklenir, aynı anda, ya da belki sona erdirmek ile hiçbir satır, bir satır silinmiş aynı anda. PostgreSQL 9.1 veya daha yüksek ** 4 işlem güvenilir bir şekilde seri hale getirme çok yüksek bir başarısızlık oranı pahasına, bir sürü deneme için olacak, yani idare edecektir. Daha ayrıntılı olarak bu davayı ele alan why is upsert so complicated bkz.

Bu yaklaşım aynı zamanda subject to lost updates in read committed isolation unless the application checks the affected row counts and verifies that either the insert or the update affected a row.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Bart Baker

    Bart Baker

    1 Aralık 2006
  • Joseph Hayhoe

    Joseph Hayho

    20 Mayıs 2010
  • spyib

    spyib

    9 Ocak 2007