DBAtlas · Atlas d'exploitation des bases de données

21000: cardinality_violation

PostgreSQL

Que signifie cette erreur ?

Plus d'une ligne a été renvoyée là où une seule était attendue. Une sous-requête scalaire a renvoyé plusieurs lignes, ou MERGE/ON CONFLICT DO UPDATE a tenté d'affecter une deuxième fois la même ligne cible. Appartient à la Class 21.

Cause

Une sous-requête utilisée dans la liste SELECT ou sous la forme WHERE = (sous-requête) qui renvoie plusieurs lignes ; la même clé de conflit proposée plusieurs fois dans un seul INSERT ... ON CONFLICT DO UPDATE ('cannot affect row a second time') ; ou plusieurs lignes source correspondant à une même ligne cible dans MERGE. UPDATE ... FROM ne lève pas d'erreur en cas de correspondances multiples ; la ligne cible est mise à jour à partir d'une seule des lignes source, de façon imprévisible.

Comment la corriger

Assurez-vous que la sous-requête renvoie une seule ligne : ajoutez LIMIT 1, utilisez un agrégat (MAX/MIN) ou fournissez une condition qui rend la correspondance unique. Dans les schémas MERGE et ON CONFLICT, dédoublonnez le côté source avec DISTINCT ON/un agrégat ; faites de même pour UPDATE ... FROM afin d'éviter des résultats silencieusement faux. Pour trouver les correspondances multiples inattendues, exécutez la sous-requête seule et vérifiez le nombre de lignes.

Ouvrir dans DBAtlas →

Autres entrées pour ce moteur