В настоящее время я пытаюсь создать базу данных sqlite, где я могу импортировать таблицу из другой базы данных sqlite (не могу присоединяться) и добавлять дополнительные данные в каждый столбец.
Поскольку нет INSERT OR UPDATE, я придумал это: 
Я думал о разделении данных на две таблицы и присоединяюсь к ним после этого, поэтому я могу просто сбросить весь импорт в одну таблицу, заменяя все, что изменилось и управляет дополнительными данными отдельно, поскольку это не изменяется при импорте.
Первая таблица (пусть называется base_data) будет выглядеть как
local_id | remote_id | base_data1 | base_data2 | ...
---------+-----------+------------+------------+----
кроме local_id все будет просто зеркалом удаленной базы данных (я, вероятно, добавлю синхронизируемую метку времени, но это не имеет значения сейчас).
Вторая таблица будет выглядеть аналогично, но remote_id устанавливается как внешний ключ
remote_id | extra_data1 | extra_data2 | ...
----------+-------------+-------------+----
   CREATE TABLE extra_data (
       remote_id INTEGER 
           REFERENCES base_data(remote_id)
           ON DELETE CASCADE ON UPDATE CASCADE
           DEFERRABLE INITIALLY DEFERRED,
       extra_data1 TEXT,
       extra_data2 TEXT,
       /* etc */
   )
Теперь моя идея состояла в просто значении INSERT OR REPLACE INTO base_data ..., потому что в базе данных, в которой я импортирую, нет синхронизации или вообще ничего, и мне пришлось бы сравнить все, чтобы узнать, какая строка у меня есть UPDATE/what to INSERT.
Но здесь проблема: INSERT OR REPLACE на самом деле является DELETE, за которой следует INSERT, а часть удаления запускает внешний ключ ON DELETE, который, как я думал, я мог бы предотвратить, создав ограничение DEFERRED. Это не работает, если я заключу INSERT OR REPLACE в транзакцию. Он всегда удаляет мои дополнительные данные, хотя такой же внешний ключ существует после инструкции.
Можно ли остановить ON DELETE для запуска до завершения INSERT OR REPLACE? Может быть, какой-то специальный режим транзакции/прагма?
