Повторяющееся значение ключа нарушает ограничение уникальности в postgres, даже если ключ не существует?

#postgresql #spring-boot

#postgresql #весенняя загрузка

Вопрос:

Запрос, который я использую, выглядит следующим образом —

 INSERT into mytable(id, tp, booleanOne, classification, booleantwo, created_at) 
        SELECT distinct uttv.id, true, false, uttv.type, false, uttv.created_at 
             FROM userTable tt WHERE booleantwo = false 
                AND type is not null 
                AND tt.id in ( 
      SELECT id from userTable WHERE status=12 AND  booleantwo=false AND booleanThree=false UNION SELECT id FROM userTable WHERE status=19
                   ) 
             AND not exists (select 1 from mytable rre where rre.id = tt.id) 
  

Таблица имеет is в качестве первичного ключа — mytable.id
Я продолжаю видеть следующую ошибку при запуске этого запроса —

 Key (id)=(2556) already exists.; nested exception is org.postgresql.util.PSQLException: ERROR: duplicate key value violates unique constraint "mytable_modified_pkey
  

И когда я проверяю mytable, я не вижу никакого идентификатора, соответствующего 2556.

Этот запрос выполняется как часть проекта spring boot, и у меня установлен уровень изоляции как сериализуемый.

Я думал, что наличие ОБЪЕДИНЕНИЯ в запросе гарантирует отсутствие повторяющихся идентификаторов, а затем использование distinct во внешнем запросе SELECT дополнительно гарантирует, что мы вставляем только не дубликаты. Я знаю, что эта ошибка возникает из-за того, что запрос select, вероятно, возвращает некоторые дубликаты, но даже тогда вы увидите, что я использую — «И НЕ СУЩЕСТВУЕТ» и гарантирую, что если идентификатор уже присутствует, не вставляйте.

Любые данные о том, почему я вижу эту ошибку, будут действительно оценены. Этот запрос также довольно медленный.

Я также попытался выполнить только часть запроса SELECT, сгруппировав по идентификатору и проверив, встречается ли какой-либо из идентификаторов более одного раза, но я не вижу никаких записей для этого. И теперь я вижу, что есть дубликаты.

 SELECT tags.tag_id, count(1) from (SELECT distinct uttv.id, true, false, uttv.type, false, uttv.created_at 
                 FROM userTable tt WHERE booleantwo = false 
                    AND type is not null 
                    AND tt.id in ( 
          SELECT id from userTable WHERE status=12 AND  booleantwo=false AND booleanThree=false UNION SELECT id FROM userTable WHERE status=19
                       ) as tags group by tags.tag_id having count(1) > 1
  

Комментарии:

1. Я не думаю, что это дубликат. В WHERE инструкции нет INSERT предложения.

Ответ №1:

Я бы сказал, что SELECT возвращает более одной строки с одинаковым значением для столбца, для которого существует ограничение уникальности employee .

Комментарии:

1. Это правда, но если я попробую distinct по всем упоминаниям id в запросе, почему это не решит проблему?

2. Это зависит от точного оператора SQL и таблиц, из которых вы выбираете… Сначала попробуйте отладить SELECT инструкцию.