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

  • Cartoonium

    Cartoonium

    11 NİSAN 2011
  • Richard Laxa

    Richard Laxa

    30 AĞUSTOS 2012
  • TheXiaxue

    TheXiaxue

    3 AĞUSTOS 2009