Bir tabloda 2 sütundan birinde çakışma olduğunda, Postgres 9.5'te upsert
yapmak mümkün mü? Temel olarak 2 sütunum var ve her iki sütun da benzersiz kısıtlama ihlali atarsa, güncelleme işlemini gerçekleştirmek istiyorum.Postgres'te 2 kolondan birinde çatışmaya nasıl girilir?
8
A
cevap
5
Evet ve bu davranış varsayılan. Herhangi bir benzersiz kısıtlama ihlali bir çatışmayı oluşturur ve belirtildiğinde, ON CONFLICT DO UPDATE
belirtilir. INSERT
ifadesinin yalnızca bir ON CONFLICT
yan tümcesi olabilir, ancak bu maddenin conflict_target
her biri UNIQUE
kısıtlaması gibi bir dizine sahip olması gereken birden çok sütun adı belirtebilir. Bununla birlikte, tek bir conflict_action
ile sınırlıdır ve bu eylemi işlerken çakışmaya neden olan kısıtlama hakkında bilgi sahibi olmazsınız. Bu tür bir bilgiye veya kısıtlama ihlaline bağlı olarak belirli bir eyleme ihtiyacınız varsa, bir tetikleme işlevi yazmalısınız, ancak INSERT ... ON CONFLICT DO ...
ifadesinin tüm önemli atomikliğini kaybedersiniz.
Bunun% 100 doğru olduğundan emin değilim, kuşkusuz soru muğlak. Eğer 2 sütun farklı özgün kısıtlamalara sahipse (bu sorudan ne anladım), o zaman ON CONFLICT sadece DO NOTHING için kullanılabilir. "Conflict_target" adı verilen zincirleme veya "ayırma" gibi görünmüyor olabilirsiniz. – Jeff
@Jeff Cevabımı genişletti. – Patrick
Güncellemeniz için teşekkürler. Aynı INSERT ile iki farklı ihlali ele alıp alamayacağımıza dair kendi sorumu yanıtlıyor. – Jeff