2010-04-01 41 views
0

只是一些背景,對不起很長時間囉嗦。更新SQLite中的多個相關表格

我正在使用System.Data.SQLite ADO.net適配器來創建一個本地sqlite數據庫,這將是唯一的進程擊中數據庫,所以我不需要擔心併發。

我從各種來源構建數據庫,並不希望使用數據集或數據適配器或類似的東西在內存中構建這一切。我想用SQL(DdCommands)來做到這一點。我不太擅長SQL,並在sqlite中完成noob。我基本上使用sqlite作爲本地數據庫/保存文件結構。

該數據庫有很多相關的表和數據無關與人民或地區或地區,而是用一個簡單的比喻,想象一下:

區表自動遞增RegionID,RegionName柱和各種可選列。有自動遞增DistrictID,DistrictName,RegionId,以及各種可選列

區表

人表自動遞增是PersonID,PERSONNAME,DistrictID,所以我得到的一些數據代表RegionName各種可選列

, DistrictName,PersonName和其他Person相關數據。該地區,地區和/或人員目前可能會或可能不會創建。

再次,不是最大的這個問題,我的想法是這樣的:

  • 檢查,看是否地區存在,如果是的話得到了RegionID
  • 別人創造,並得到RegionID
  • 檢查區是否存在,如果是這樣得到區ID
  • 否則創建它添加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 2010-04-02 01:16:39

+0

當我閱讀答案時,它是有道理的,但我沒有得到我期望的,現在我正在代碼中嘗試它。 它很接近,但仍然不太正確。例如,在區表中,DistrictID和RegionID具有相同的每行值,而RegionID實際上與Region表中的RegionID匹配。 Person表中的相同內容。 此外,它看起來好像每個碰撞都會導致主鍵發生變化。如果其他表格指向這個主鍵我不明白那可能是好的。 – PerryJ 2010-04-15 22:03:44

+0

我最終做了這裏解釋的: http://probertson.com/articles/2009/11/30/multi-table-insert-one-statement-air-sqlite/ – PerryJ 2010-04-29 23:27:12