Мы нашли сервис, который делает INSERT в эту таблицу. После добавления уникального ограничения сервис начал падать с ошибкой. Можем ли мы модифицировать SQL-запрос, чтобы он не падал при срабатывании уникального ограничения, не трогая логику приложения?

В PostgreSQL можно использовать INSERT ... ON CONFLICT ... DO NOTHING, если по бизнес-правилам повторную вставку допустимо пропустить. Но совместимость с ожиданиями приложения нужно проверить.

Короткий ответ

Что ответить на собеседовании

В PostgreSQL можно использовать INSERT ... ON CONFLICT ... DO NOTHING, если по бизнес-правилам повторную вставку допустимо пропустить. Но совместимость с ожиданиями приложения нужно проверить.

Подробный разбор

Ответ с пояснениями

В PostgreSQL можно использовать INSERT ... ON CONFLICT ... DO NOTHING, если по бизнес-правилам повторную вставку допустимо пропустить. Но совместимость с ожиданиями приложения нужно проверить.

Например, при уникальном external_id: INSERT INTO orders (external_id) VALUES (:id) ON CONFLICT (external_id) DO NOTHING.

Укажите целевой конфликт осознанно, чтобы не скрыть неожиданное нарушение другой уникальности. При пропуске RETURNING не выдаёт новую строку, число изменённых строк равно нулю, а последовательность ID может уже продвинуться. Если приложение требует созданный объект или должно обновить данные, одной замены SQL недостаточно. Ошибки CHECK, FK и другие независимые сбои не исчезают.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее