Вы можете избежать нарушения ограничения (и, следовательно, проблемы исключений и транзакций), изменив свой INSERT
INSERT INTO link(id, idPage, url, linkText, visited, broken)
SELECT nextval('idLinkSqc'), ?, ?, ?, ?, ?
FROM link
WHERE NOT EXISTS (SELECT url FROM link WHERE url = ?)
LIMIT 1
И затем дополнительный заполнитель:
pstm.setString(6, link.getUrl());
Вы можететакже замените ваш необработанный INSERT на хранимую процедуру, которая проверит, что новый URL еще не существует, прежде чем пытаться выполнить INSERT.
UPDATE : улучшенная версия SQL вышебудь это:
INSERT INTO link (id, idPage, url, linkText, visited, broken)
SELECT nextval('idLinkSqc'), ?, ?, ?, ?, ?
FROM (
SELECT 1
WHERE NOT EXISTS (SELECT 1 FROM link WHERE url = ?)
) AS postgres_needs_this_alias
Конечный результат должен быть таким же, но эта версия не требует взлома LIMIT 1
.Идея заключается в том, чтобы использовать внутренний SELECT для создания одной строки, если url
не присутствует (отсюда дополнительный вложенный бизнес НЕ СУЩЕСТВУЕТ), и нет строк, если присутствует url
;затем мы используем количество строк из внутреннего SELECT в качестве счетчика для того, сколько строк должно быть вставлено в link
.Проверка EXISTS
на индексированный столбец также должна быть достаточно быстрой.