Обновление нескольких связанных таблиц в SQLite

Просто немного предыстории, извините, что так многословно.

Я использую адаптер System.Data.SQLite ADO.net для создания локальной базы данных sqlite, и это будет единственный процесс, обращающийся к базе данных, поэтому мне не нужно беспокоиться о параллелизме.

Я создаю базу данных из разных источников и не хочу создавать все это в памяти, используя наборы данных или адаптеры данных или что-то в этом роде. Я хочу сделать это с помощью SQL (DdCommands). Я не очень хорошо разбираюсь в SQL и полный нуб в sqlite. Я в основном использую sqlite в качестве локальной базы данных/файловой структуры сохранения.

В базе данных есть много связанных таблиц, и данные не имеют ничего общего с людьми, регионами или районами, но, используя простую аналогию, представьте:

Таблица регионов с автоинкрементом RegionID, столбцом RegionName и различными необязательными столбцами.

Таблица районов с автоматическим увеличением DistrictID, DistrictName, RegionId и различными необязательными столбцами

Таблица лиц с автоматическим увеличением PersonID, PersonName, DistrictID и различными необязательными столбцами

Итак, я получаю некоторые данные, представляющие RegionName, DistrictName, PersonName и другие данные, связанные с Person. Регион, район и/или лицо могут быть созданы или не созданы на этом этапе.

Еще раз, не будучи лучшим в этом, мои мысли будут примерно такими:

  • Проверьте, существует ли регион, и если да, то получите идентификатор региона.
  • иначе создайте его и получите RegionID
  • Проверьте, существует ли District, и если да, то получите DistrictID.
  • иначе создайте его, добавив в RegionID сверху и получите DistrictID
  • Проверьте, существует ли Person, и если да, то получите PersonID.
  • иначе создайте его, добавив в DistrictID сверху и получите PersonID
  • Обновите Person с остальными данными.

В MS SQL Server я бы создал хранимую процедуру для обработки всего этого.

Единственный способ, которым я могу это сделать с помощью sqlite, - это множество команд. Так что я уверен, что не понимаю этого. Я провел часы, осматривая различные сайты, но просто не чувствую, что иду по правильному пути. Любые предложения будут ценны.


person PerryJ    schedule 01.04.2010    source источник


Ответы (1)


Используйте last_insert_rowid() в сочетании с INSERT OR REPLACE. Что-то типа:

INSERT OR REPLACE INTO Region (RegionName)
                       VALUES (:Region   );

INSERT OR REPLACE INTO District(DistrictName, RegionID           )
                        VALUES (:District   , last_insert_rowid());

INSERT OR REPLACE INTO Person(PersonName, DistrictID           )
                      VALUES (:Person   , last_insert_rowid());
person Marcelo Cantos    schedule 02.04.2010
comment
Это имело смысл, когда я прочитал ответ, но теперь я не получаю того, чего ожидал, когда пробую это в коде. Это близко, но все еще не совсем правильно работает. Например, в таблице District DistrictID и RegionID имеют одинаковые значения для каждой строки, вместо того, чтобы RegionID фактически совпадал с RegionID в таблице Region. То же самое и в таблице Person. Кроме того, похоже, что каждое столкновение вызывает изменение первичного ключа. Если другие таблицы указывают на этот первичный ключ, я не понимаю, как это может быть хорошо. - person PerryJ; 16.04.2010
comment
В итоге я сделал то, что было объяснено здесь: probertson.com/articles/2009/11/30/ - person PerryJ; 30.04.2010