В настоящее время я пытаюсь создать базу данных 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
? Может быть, какой-то специальный режим транзакции/прагма?