【问题标题】:SQLite : Choose the right record to link when auto increment primary keySQLite:自动递增主键时选择要链接的正确记录
【发布时间】:2015-06-27 08:51:55
【问题描述】:

我有一个 SQLite 数据库,其中一个表具有一个自动增量整数作为主键,另一个表通过外键链接到第一个表。 我不明白如何选择第一个表中的哪一行与第二个表中的正确行链接。

让我用一个例子来说明:

具有自动递增主键 (0, 1, 2, ..., 10) 的学生表

包含这些行的表格课程: name = 'French', Grade = 'B', student (外键) = 3

如何告诉数据库学生 3 的法语成绩为 B?因为我不知道分配给学生的主键(自动编号),所以我只知道他的名字。

【问题讨论】:

  • 结果表:classID, studentID, result_value,所以基本上你会插入('spring 2015 french', 'john doe student ID', 'B')。大概学生已经必须存在于您表中的其他地方,例如在登记表中。所以获取该记录的 ID:stackoverflow.com/questions/8892973/…

标签: sql database sqlite foreign-keys


【解决方案1】:

您可以使用内置的 Sqlite 函数 sqlite3_last_insert_rowid() like thislike this

如果您正在运行多线程的东西,看起来好像有一些问题,所以请确保read up on on proper usage。在其中一个参考文献中发布的示例将其作为替代方案。我还没有尝试过,但值得探索:

select seq from sqlite_sequence where name="table_name"

【讨论】:

  • 这可以工作,但我必须得到除最后创建的其他行。例如,我有一个有两个外键的表:即使我从 last_insert_rowid() 函数中得到其中一个,我也不能对另一个做同样的事情。
  • 所有外键都是最后插入的吗?如果是这样,您可以这样做:
  • 不,它们是按随机顺序插入的(来自金融数据提供商)。我不敢相信没有更好的方法来查找记录。这意味着任何自动主键都不能轻易用作外键,这没有意义,因为主键是为链接而设计的......
  • 我认为您唯一的选择是在构建插入语句之前执行适当的查询。如果您要插入其他表,则可以在每次插入后使用 sqlite3_last_insert_rowid,然后保存 ID。否则,只需执行获取 id 所需的任何查询,然后使用这些 id 创建插入语句。这意味着我知道的额外步骤,但这是唯一可靠的方法。
  • 您也许可以优化事物,只需执行一次查询即可获得所需的所有 id。您可以将其作为具有多个子查询的查询来执行。 Take a look - 多看几遍后不确定这是否可行。对不起。
【解决方案2】:

当然,您总是需要一个自然键来识别每个结果的学生。我假设学生的名字是不够的,因为你可以有几个同名的学生。通常,您会希望学生有一个卷号或类似的标识符分配给他们。如果您没有足够的信息来唯一识别学生,那么显然无法判断哪些结果属于哪个学生!

【讨论】:

    猜你喜欢
    • 2017-01-09
    • 2015-05-11
    • 2013-05-11
    • 2011-03-18
    • 2013-02-04
    • 1970-01-01
    • 1970-01-01
    • 2013-04-06
    相关资源
    最近更新 更多