#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
инструкцию.