SQLite使用内部插入的id插入表中

时间:2017-06-04 09:35:30

标签: sqlite

我正在尝试同时插入父母和孩子。

我的想法是插入父级,使用int main() { char *t[3] = {"string", "foo", "help"}; int i; foo(t, 3, 10); for (i = 0; i < 3; ++i) printf("%s\n", t[i]); return EXIT_SUCCESS; } 获取ID并使用此ID插入子级

我可以让每个部分独立工作,但不能作为一个整体。这就是我目前所拥有的:

SELECT last_insert_rowid() AS [Id]

以上作品 - 到目前为止一切顺利。现在我想在子插入中使用this的结果。这就是我所拥有的:

INSERT INTO ParentTable (Col1) 
VALUES( 'test') 
SELECT last_insert_rowid() AS [Id] 

我收到此错误:

  

靠近“SELECT”:语法错误:

有人能指出我正确的方向吗?

2 个答案:

答案 0 :(得分:1)

您无法在INSERT声明中使用SELECT。您应该首先插入然后使用最后插入的id:

INSERT INTO ParentTable (Col1) VALUES( 'test');

INSERT INTO ChildTable (col1, col2, ParentId) 
    VALUES(1,2, (SELECT last_insert_rowid()));

由于您要插入包含父ID的许多记录,因此这是一种解决方法:

BEGIN TRANSACTION;
CREATE TEMPORARY TABLE IF NOT EXISTS temp(id integer);
DELETE FROM temp;
INSERT INTO ParentTable (Col1) VALUES( 'test');
INSERT INTO temp SELECT last_insert_rowid();
INSERT INTO ChildTable (col1, col2, ParentId) 
    VALUES(1,2, (SELECT id FROM temp LIMIT 1));
.............
COMMIT;
DROP TABLE temp;

或者您可以为此创建一个永久表。

答案 1 :(得分:0)

SQLite.Net PCL driver假设您使用ORM:插入对象将自动回读并分配自动增加的ID值。

如果您正在使用原始SQL,则必须自行管理last_insert_rowid()来电。 您的想法是正确的,但您必须在单独的SQL语句中执行所有操作:

BEGIN;                       -- better use RunInTransaction()

INSERT INTO Parent ...;
SELECT last_insert_rowid();  --> store in a variable in your program

INSERT INTO Child ...;
...

END;

(SQLite是一个嵌入式数据库,没有客户端/服务器通信开销;没有理由尝试将所有内容都压缩到一个语句中。)