UPSERT SQLite: повтор сообщения распознаётся по ключу, а не по совпадению измерений
Фотография конкретного исполнения не приложена.
UPSERT меняет поведение INSERT при нарушении ограничения уникальности: выполняется предусмотренное обновление либо отказ от вставки. Для повторной доставки телеметрии сначала нужен корректный ключ сообщения и соответствующий UNIQUE, PRIMARY KEY или уникальный индекс. Само слово UPSERT не создаёт идентичность входящего события.
Два одинаковых показания датчика могут быть разными измерениями, а повтор одного сообщения — содержать тот же идентификатор при новом времени получения. Поэтому дедупликацию проектируют по идентичности источника и события, а исходное время измерения и время приёма сохраняют отдельно по принятой схеме.
UPSERT не перехватывает ошибки NOT NULL, CHECK или внешних ключей. Их обработка остаётся отдельной обязанностью приложения. При многострочной вставке решение принимается для каждой строки, что нужно учитывать при проверке целостности всего прикладного пакета и результата его повторной доставки.
В приёмке повторяют известное сообщение, добавляют другое с тем же значением и передают строку с ошибкой другого ограничения. Проверяют число записей, неизменность идентичности и предсказуемое обновление разрешённых полей. Отсутствие исключения в одной ветке не подтверждает защиту от всех дублей или всех некорректных данных.
Основание — SQLite official unversioned documentation snapshot; Download index observed 3.54.1, individual pages not version-tagged, разделы 2. Description; uniqueness constraints. Сохранён текст публичной справочной публикации; конкретная реализация может поддерживать только часть возможностей. Установленная библиотека, сборка, файловая система и база узла не проверялись. Это проектный сценарий; SQL и сервисные операции на реальных данных не выполнялись.