Если вы можете сформулировать или изменить SQL самостоятельно, либо для INSERT
, либо для начального CREATE TABLE
, вы можете использовать расширение обработки конфликтов SQLite . Есть два варианта, как это сделать:
- При вставке используйте
INSERT OR IGNORE
вместо INSERT
. Вы также можете использовать OR REPLACE
, OR ABORT
или любую другую реакцию.
- При создании таблицы укажите предложение
ON CONFLICT IGNORE
для ограничения UNIQUE
. Это заставит вставки или обновления, которые нарушают ограничение, ничего не делать.
Мне кажется, что идея использования INSERT OR IGNORE
/ INSERT OR REPLACE
для обработки дублирующихся данных, особенно в параллельных средах, очень чистая. Он проверяет дублирование один раз - в базе данных - и избегает условий гонки, когда вы сначала проверяете существование (по общему признанию, это не проблема, если только один процесс / поток обращается к базе данных).
Однако, если дубликаты являются результатом ошибки (а не дублируют события / действия, которые ваш код просто не дедуплицирует явно), то это может быть просто сокрытие ошибки, а не ее исправление. Однако, на мой взгляд, отсутствие явной дедуляции не является ошибкой. Поэтому, если исправление заключается в проверке дубликатов, используйте базу данных; если реальная проблема заключается в том, что они были сгенерированы в первую очередь (на уровне приложения, а не на уровне строки базы данных), то я, вероятно, буду искать эту проблему.