2010-04-01 1 views
0

Просто какой-то фон, извините, так долго наматывается.Обновление нескольких связанных таблиц в SQLite

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

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

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

области с автоматическим приращением RegionId, колонками RegionName и различными необязательные столбцы.

района стол с автоматическим приращением DistrictID, DistrictName, RegionId и различными дополнительными столбцами

Person таблица с автоматическим приращением PersonId, PERSONNAME, DistrictID и различными дополнительными столбцами

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

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

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

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

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

ответ

2

Использовать 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()); 
+0

Я сделаю снимок. Благодаря! – PerryJ

+0

Это имело смысл, когда я читал ответ, но я не получаю то, что ожидаю сейчас, когда я пытаюсь использовать его в коде. Это близко, но все еще не совсем работает. Например, в таблице District, DistrictID и RegionID имеют одинаковые значения для каждой строки, а не RegionID, фактически соответствующие регионуID в таблице Region. То же самое в таблице Person. Кроме того, похоже, что каждое столкновение приводит к изменению первичного ключа. Если другие таблицы указывают на этот первичный ключ, я не вижу, как это может быть хорошо. – PerryJ

+0

Я закончил тем, что объяснялось здесь: http://probertson.com/articles/2009/11/30/multi-table-insert-one-statement-air-sqlite/ – PerryJ

 Смежные вопросы

  • Нет связанных вопросов^_^