21000: cardinality_violation
PostgreSQLNe demek?
Tek satır beklenen bir yerde birden fazla satır döndü. Skaler bir alt sorgunun (scalar subquery) birden çok satır döndürmesi ya da MERGE/ON CONFLICT DO UPDATE'in aynı hedef satırı ikinci kez etkilemeye çalışması durumudur. Class 21 sınıfındadır.
Neden olur?
SELECT listesinde ya da WHERE = (alt sorgu) biçiminde kullanılan bir alt sorgunun birden çok satır döndürmesi; INSERT ... ON CONFLICT DO UPDATE'te aynı komutta aynı çakışma anahtarının birden çok kez önerilmesi ('cannot affect row a second time'); ya da MERGE'de bir hedef satıra birden çok kaynak satırın eşleşmesi. UPDATE ... FROM'da çoklu eşleşme hata vermez; hedef satır kaynak satırlardan yalnızca biriyle, öngörülemez biçimde güncellenir.
Nasıl çözülür?
Alt sorgunun tek satır döndürdüğünden emin olun: LIMIT 1 ekleyin, bir toplama (MAX/MIN) kullanın ya da eşleşmeyi tekilleştiren bir koşul verin. MERGE ve ON CONFLICT kalıplarında kaynak tarafı DISTINCT ON/aggregate ile tekilleştirin; aynısını sessiz yanlış sonuçlara karşı UPDATE ... FROM için de yapın. Beklenmedik çoklu eşleşmeleri bulmak için alt sorguyu tek başına çalıştırıp satır sayısını kontrol edin.