2010-04-01 42 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