21000: cardinality_violation
PostgreSQL¿Qué significa?
Se devolvió más de una fila donde se esperaba una sola. Una subconsulta escalar devolvió varias filas, o MERGE/ON CONFLICT DO UPDATE intentó afectar por segunda vez a la misma fila de destino. Pertenece a la Class 21.
¿Por qué ocurre?
Una subconsulta usada en la lista SELECT o en la forma WHERE = (subquery) que devuelve varias filas; la misma clave de conflicto propuesta más de una vez en un único INSERT ... ON CONFLICT DO UPDATE ('cannot affect row a second time'); o varias filas de origen que coinciden con una fila de destino en MERGE. UPDATE ... FROM no genera error con coincidencias múltiples; la fila de destino se actualiza solo a partir de una de las filas de origen, de forma impredecible.
Cómo solucionarlo
Asegúrese de que la subconsulta devuelva una sola fila: añada LIMIT 1, use un agregado (MAX/MIN) o proporcione una condición que haga única la coincidencia. En los patrones MERGE y ON CONFLICT, elimine duplicados en el lado de origen con DISTINCT ON/agregado; haga lo mismo con UPDATE ... FROM para evitar resultados erróneos silenciosos. Para encontrar coincidencias múltiples inesperadas, ejecute la subconsulta por separado y revise el número de filas.