DBAtlas · Atlas de operações de banco de dados

21000: cardinality_violation

PostgreSQL

O que significa?

Mais de uma linha foi retornada onde se esperava uma única linha. Uma subconsulta escalar retornou várias linhas, ou MERGE/ON CONFLICT DO UPDATE tentou afetar a mesma linha de destino uma segunda vez. Pertence à Class 21.

Por que acontece?

Uma subconsulta usada na lista do SELECT ou na forma WHERE = (subconsulta) retornando várias linhas; a mesma chave de conflito proposta mais de uma vez em um único INSERT ... ON CONFLICT DO UPDATE ('cannot affect row a second time'); ou várias linhas de origem correspondendo a uma linha de destino no MERGE. UPDATE ... FROM não gera erro com múltiplas correspondências; a linha de destino é atualizada a partir de apenas uma das linhas de origem, de forma imprevisível.

Como resolver

Garanta que a subconsulta retorne uma única linha: adicione LIMIT 1, use uma agregação (MAX/MIN) ou forneça uma condição que torne a correspondência única. Nos padrões MERGE e ON CONFLICT, elimine duplicatas no lado da origem com DISTINCT ON/agregação; faça o mesmo com UPDATE ... FROM para evitar resultados silenciosamente errados. Para encontrar correspondências múltiplas inesperadas, execute a subconsulta isoladamente e verifique a contagem de linhas.

Abrir no DBAtlas →

Mais entradas deste banco