В PostgreSQL можно использовать INSERT ... ON CONFLICT ... DO NOTHING, если по бизнес-правилам повторную вставку допустимо пропустить. Но совместимость с ожиданиями приложения нужно проверить.
Мы нашли сервис, который делает INSERT в эту таблицу. После добавления уникального ограничения сервис начал падать с ошибкой. Можем ли мы модифицировать SQL-запрос, чтобы он не падал при срабатывании уникального ограничения, не трогая логику приложения?
В 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 и другие независимые сбои не исчезают.