DBAtlas · Atlas für Datenbankbetrieb

21000: cardinality_violation

PostgreSQL

Was bedeutet das?

Es wurde mehr als eine Zeile zurückgegeben, wo eine einzelne Zeile erwartet wurde. Eine skalare Unterabfrage lieferte mehrere Zeilen, oder MERGE/ON CONFLICT DO UPDATE versuchte, dieselbe Zielzeile ein zweites Mal zu ändern. Gehört zu Klasse 21.

Ursache

Eine Unterabfrage in der SELECT-Liste oder in der Form WHERE = (subquery), die mehrere Zeilen liefert; derselbe Konfliktschlüssel wird in einem einzigen INSERT ... ON CONFLICT DO UPDATE mehrfach vorgeschlagen ('cannot affect row a second time'); oder mehrere Quellzeilen passen bei MERGE zu einer Zielzeile. UPDATE ... FROM löst bei mehreren Treffern keinen Fehler aus; die Zielzeile wird unvorhersehbar aus nur einer der Quellzeilen aktualisiert.

Lösung

Stelle sicher, dass die Unterabfrage eine einzige Zeile liefert: Füge LIMIT 1 hinzu, nutze ein Aggregat (MAX/MIN) oder eine Bedingung, die den Treffer eindeutig macht. Dedupliziere bei MERGE- und ON-CONFLICT-Mustern die Quellseite mit DISTINCT ON/Aggregat; tu dasselbe bei UPDATE ... FROM, um stillschweigend falsche Ergebnisse zu vermeiden. Um unerwartete Mehrfachtreffer zu finden, führe die Unterabfrage allein aus und prüfe die Zeilenzahl.

In DBAtlas öffnen →

Weitere Einträge zu dieser Datenbank