在 SQLite 中将 SQL 数据插入到链接(外键)表中

Posted

技术标签:

【中文标题】在 SQLite 中将 SQL 数据插入到链接(外键)表中【英文标题】:Inserting SQL Data into Linked (Foreign Key) Tables in SQLite 【发布时间】:2011-04-29 04:16:12 【问题描述】:

我有两个通过外键链接的表。示例:

"CREATE TABLE one (id INTEGER PRIMARY KEY, data REAL, time TEXT NOT NULL DEFAULT (datetime('now')));"

"CREATE TABLE 二(id INTEGER PRIMARY KEY, parent INTEGER, CONSTRAINT fc_two FOREIGN KEY (parent) REFERENCES one(id));"

所以我想使用嵌入式 JOIN 执行 INSERT INTO,但我已经尝试过(然后用 Google 搜索),显然它不起作用。我确实找到了一种使用名为@@Identity 的方法,但这似乎不适用于SQLite。基本上,我需要:

    将数据插入一个 查找我刚刚插入的行的“id”值 使用我刚刚从一个中获得的 id 值将数据插入两个

1 和 3 很简单,但要获得 2,我需要查询我刚刚插入的那个。没有任何数据列(id 除外)是唯一的,并且唯一的组合(所有非 id 列的集合作为一个整体是唯一的,而不是任何单独的列)是不可能可靠地查询的。

执行此操作的最佳方法是什么?

【问题讨论】:

【参考方案1】:
SELECT last_insert_rowid()

【讨论】:

很好,确实有效。但是,我现在有另一个问题。在 INSERT 语句中使用 last_insert_rowid() 可以正常工作,但是下一个 INSERT 语句会失败。我需要以某种方式“存储”该临时值并在多个 INSERT 语句中将其使用到第二个表中。关于如何做到这一点的任何想法? 那么是什么阻止您将 last_insert_rowid() 的值保存到变量并在其他参数(如 selectionArgs)中提供它以供进一步插入语句? 问题是,如果我执行一个 SQLite 语句并获取值,然后使用该值执行另一个 SQLite 语句,它会使用两个语句。我不确定这是否是锁定问题,因为从技术上讲,单个事务应该是单个 SQLite 语句,因为在两次插入之间,数据库处于不一致状态。如果我分解语句(SQL 语句 -> C 变量 -> SQL 语句),它会分解事务。我想要一种将所有内容保存在单个 SQL 字符串中的方法……或者像这样拆分它不是问题吗? 使用db.beginTransaction()不会有问题,然后执行所有插入操作并调用db.setTransactionSuccessful()、db.endTransaction()。 SQLite 没有 beginTransaction() 函数;事务在 SQL 代码中处理;但是,BEGIN TRANSACTION 和 END TRANSACTION 语句中的所有语句都必须包含在单个 SQL 块中。那是我的问题;我无法在 SQLite 的那个 SQL 块中存储中间值。

以上是关于在 SQLite 中将 SQL 数据插入到链接(外键)表中的主要内容,如果未能解决你的问题,请参考以下文章

对于所有外键,如何在 SQL 中将数据类型从 32 位整数升级到 64 位整数?

如何在 Xamarin Forms 中将日期、日期时间和时间保存到 SQLite 数据库?

是否可以在单个查询中将 x 个默认值插入到空 SQLite 表中?

如何在 Sqlite 中将两列合二为一,同时获取外键的底层值?

在 Python 中将 Null 插入 SQLite3

我们可以在 Windows 窗体应用程序中将 sql 精简版数据库移动到 sqlite 数据库吗