Soru Postgre'lerde Şartlı INSERT INTO bildirimi


Bir sahte havayolu rezervasyon veritabanı için bir rezervasyon prosedürü yazıyorum ve gerçekten yapmak istediğim şey şunun gibi:

IF EXISTS (SELECT * FROM LeadCustomer 
    WHERE FirstName = 'John' AND Surname = 'Smith') 
THEN
   INSERT INTO LeadCustomer (Firstname, Surname, BillingAddress, email) 
   VALUES ('John', 'Smith', '6 Brewery close,
            Buxton, Norfolk', cmp.testing@example.com');

Fakat Postgres desteklemiyor IF PL / pgSQL uzantısını yüklemeden ifadeler. Bunun bir miktar eşdeğer bir yolu olup olmadığını veya bu adımda sadece kullanıcı etkileşimi olması gerekecek mi diye merak ediyordum?


25
2018-03-29 19:29


Menşei


Neden sadece PL / pgSQL uzantısını yüklemiyorsunuz? - Matt Ball
@MattBall: Laboratuvar bilgisayarlarında postgres kurulumu ile çalışmak. Bu uzantıyı kullanmak spesifik değildir. - The General


Cevaplar:


Bu belirli komut şu şekilde yapılabilir:

insert into LeadCustomer (Firstname, Surname, BillingAddress, email)
select 
    'John', 'Smith', 
    '6 Brewery close, Buxton, Norfolk', 'cmp.testing@example.com'
where not exists (
    select * from leadcustomer where firstname = 'John' and surname = 'Smith'
);

Seçim ifadesinin sonucunu ve select Bu müşteri yoksa sadece bir satır döndürür.


52
2018-03-29 20:01



Burada bir (çok küçük) yarış var mı? Seçme alt sorgu çalışır, 0 satırı döndürür, başka bir iş parçacığında bir ekleme oluşur ve sonra LeadCustomer eki oluşur? - Kevin Burke
@Kevin Birincil anahtar istisnası yükseltilecek ve uygulama ne yapacağına karar verecektir. - Clodoaldo Neto
Kafam karıştı, soru ana anahtarlardan bahsetmiyor. Birincil anahtar varsa (ad, soyadı) neden ilk önce eklemeyi denemediniz? - Kevin Burke
@Kevin Önce eki deneyeceğim. Soru sadece sözdizimi hakkında. - Clodoaldo Neto
Bunun gibi birden fazla satır eklemek için bir yol var mı? - Callum Rogers


Pgsql desteğinin 9.5 sürümünden itibaren INSERT ... ÇATIŞMA ÜZERİNDE GÜNCELLEME ...

Aşağıdaki cevap artık alakalı değil. Postgres 9.5, birkaç yıl sonra daha iyi bir çözümle serbest bırakıldı.

Postgres yok "Upsert"yeni işlevler eklemeden işlevsellik.
Yapmanız gereken şey, seçim sorgusunu çalıştırıp eşleşen satırlarınız olup olmadığına bakmaktır. Eğer yaparsanız, o zaman yerleştirin.

Tam olarak bir upset istemediğini biliyorum, ama hemen hemen aynı.


1
2018-03-29 19:38



Bunu yapmanın bir yolu var: stackoverflow.com/a/8702291/330315 - a_horse_with_no_name
Bu, bir çakışma olduğunda bile otomatik artırılmış kimliği artırmaya devam edecektir (ekleme girişiminde bulunduğundan) - rohanagarwal
"Sonuçları kontrol edin ve koşullu olarak ekleme" yarış koşullarına eğilimlidir: Aynı anda iki iş parçacığınız varsa, iki ekleme yapabilirsiniz. - Charles Duffy
@CharlesDuffy işleminde değil (veya güncelleme için seçildiyse) - Kamil Tomšík