DBAtlas · Атлас эксплуатации баз данных

21000: cardinality_violation

PostgreSQL

Что это значит?

Возвращено больше одной строки там, где ожидалась одна. Скалярный подзапрос вернул несколько строк, либо MERGE/ON CONFLICT DO UPDATE попытался повторно затронуть одну и ту же целевую строку. Относится к классу 21.

Почему возникает?

Подзапрос в списке SELECT или в форме WHERE = (subquery), возвращающий несколько строк; один и тот же конфликтный ключ, предложенный более одного раза в одном INSERT ... ON CONFLICT DO UPDATE ('cannot affect row a second time'); либо несколько исходных строк, соответствующих одной целевой строке в MERGE. UPDATE ... FROM не выдаёт ошибку при множественных совпадениях; целевая строка непредсказуемо обновляется только по одной из исходных строк.

Как исправить

Убедитесь, что подзапрос возвращает одну строку: добавьте LIMIT 1, используйте агрегат (MAX/MIN) или условие, делающее совпадение уникальным. В шаблонах MERGE и ON CONFLICT устраните дубликаты на стороне источника с помощью DISTINCT ON/агрегата; сделайте то же для UPDATE ... FROM, чтобы избежать незаметно неверных результатов. Чтобы найти неожиданные множественные совпадения, выполните подзапрос отдельно и проверьте количество строк.

Открыть в DBAtlas →

Ещё по этой СУБД