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

SQLite是否支持范围标识?

  •  18
  • Greg  · 技术社区  · 15 年前

    我试图执行一个简单的插入并返回标识(自动递增主键)。我试过了

    cmd.CommandText = "INSERT INTO Prototype ( ParentID ) VALUES ( NULL ); SELECT SCOPE_IDENTITY();";
    

    我收到以下错误

    EnvironmentError: SQLite error
    no such function: SCOPE_IDENTITY

    SQLite是否支持范围标识?
    如果是,我如何使用它?
    如果不是,我的(最好是“线程安全的”)备选方案是什么?

    2 回复  |  直到 15 年前
        1
  •  27
  •   Michael    15 年前

    如果您不使用C接口进行编程,并且希望通过SQL命令执行此过程,请尝试: SELECT last_insert_rowid()

    http://www.sqlite.org/lang_corefunc.html

        2
  •  21
  •   Robert Wagner    15 年前

    查看 FAQ . 这个 sqlite3_last_insert_rowid() 函数就可以了。不过要小心触发器。

        3
  •  0
  •   bsigma1    5 年前

    这个 last_insert_rowid() 结果是最后一次插入到任何表中的行id。绝对不是其他答案中提到的线程安全。

    如果你绝对 需要 为了确保返回的行id正确,而不考虑线程、异步等(例如,如果您打算在另一个表中将该行id用作外键),以下是一种方法:

    1. 将文本列插入所需的表中(这将包含GUID)
    2. 手动生成GUID(使用您的语言中可用的任何库)并将其保存在内存中
    3. 将数据与刚才生成的GUID一起插入表中
    4. 通过检索(假定的)rowid
    5. 将检索到的行中的GUID与内存中仍然存在的GUID进行比较
      • 如果它们是相同的,快乐的日子,你有正确的rowid
      • 如果它们不同,则需要在表中查询与内存中的GUID匹配的正确rowid

    显然,此解决方案存在相当大的性能缺陷,您需要判断数据不匹配的风险是否超过性能损失。在我的例子中,我首先需要确定我的数据的完整性,这样性能就可以承受冲击。(我说不出有多大的成功率。)

    您可能会有跳过第4步和第5步的冲动,并使用GUID获取rowid;您可能还迫切需要将GUID用作主标识符和外键。毕竟