代码之家  ›  专栏  ›  技术社区  ›  PerryJ

更新sqlite中的多个相关表

  •  0
  • PerryJ  · 技术社区  · 14 年前

    只是一些背景,对不起,这么久了。

    我正在使用system.data.sqlite ado.net适配器创建本地sqlite数据库,这将是访问数据库的唯一进程,因此我不需要担心并发性。

    我正在从各种来源构建数据库,不想使用数据集、数据适配器或类似的东西构建内存中的所有内容。我想使用SQL(ddcommands)来实现这一点。我不太擅长SQL和SQLite中的完全noob。我基本上使用sqlite作为本地数据库/保存文件结构。

    数据库有很多相关的表,数据与人员、地区或地区无关,但要使用一个简单的类比,请想象:

    带有自动递增regionid、regionname列和各种可选列的区域表。

    带有自动递增districtid、districtname、regionid和各种可选列的区域表

    带有自动递增的personid、personname、districid和各种可选列的person表

    所以我得到了一些代表地区名、地区名、人名和其他人相关数据的数据。此时可以或不可以创建区域、地区和/或人员。

    再一次,不是最伟大的,我的想法是:

    • 检查区域是否存在,如果存在,则获取区域ID
    • 否则创建它并获取regionid
    • 检查区域是否存在,如果存在,则获取区域
    • 否则创建它,从上面添加regionid并得到districid
    • 检查人员是否存在,如果存在,获取人员ID
    • 否则创建它,从上面添加districted并获取personid
    • 使用其他数据更新人员。

    在MS SQL Server中,我将创建一个存储过程来处理所有这些问题。

    我能用sqlite实现这一点的唯一方法是使用大量命令。所以我肯定我不明白。我花了好几个小时在不同的网站上四处寻找,但只是觉得自己走错了路。任何建议都将不胜感激。

    1 回复  |  直到 14 年前
        1
  •  2
  •   Marcelo Cantos    14 年前

    使用 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());