使用内部插入的id将SQLite插入到表中
我正在尝试同时插入父项和子项 我的想法是插入父对象,使用使用内部插入的id将SQLite插入到表中,sqlite,Sqlite,我正在尝试同时插入父项和子项 我的想法是插入父对象,使用选择last\u insert\u rowid()作为[id]获取id,然后使用此id插入子对象 我可以让每个部分独立工作,但不能作为一个整体。这就是我目前拥有的: INSERT INTO ParentTable (Col1) VALUES( 'test') SELECT last_insert_rowid() AS [Id] 以上工作-到目前为止还不错。现在我想在子插入中使用这个结果。这就是我所拥有的: INSERT INTO C
选择last\u insert\u rowid()作为[id]
获取id,然后使用此id插入子对象
我可以让每个部分独立工作,但不能作为一个整体。这就是我目前拥有的:
INSERT INTO ParentTable (Col1)
VALUES( 'test')
SELECT last_insert_rowid() AS [Id]
以上工作-到目前为止还不错。现在我想在子插入中使用这个结果。这就是我所拥有的:
INSERT INTO ChildTable (col1, col2, ParentId)
VALUES( 1, 2, SELECT Id FROM (
INSERT INTO ParentTable (Col1)
VALUES( 'test')
SELECT last_insert_rowid() AS [Id]
);
我得到这个错误:
“选择”附近:语法错误:
有人能给我指出正确的方向吗?您不能在
SELECT
语句中使用INSERT
。您应该先插入,然后使用最后插入的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;
或者您可以为此创建一个永久表。假设您使用ORM:插入对象将自动读回并分配自动递增的ID值
如果您使用的是原始SQL,则必须自己管理调用。
您的想法是正确的,但您必须在单独的SQL语句中执行所有操作:
BEGIN; -- better use RunInTransaction()
INSERT INTO Parent ...;
SELECT last_insert_rowid(); --> store in a variable in your program
INSERT INTO Child ...;
...
END;
(SQLite是一个嵌入式数据库,没有客户机/服务器通信开销;没有理由尝试将所有内容压缩到一个语句中。)我刚刚使用此方法进行了测试-问题是我有数百个子项要插入-再次使用
last\u insert\u rowid
会导致上一个子项的id-我需要某种变量来存储父项id,以便在子项插入中使用。我认为SQLite没有变量?如果我错了,请纠正我,你使用的是哪种语言的SQLite?我使用的是C#谢谢。你使用的众多C#SQLite数据库驱动程序中的哪一个?SQLite.Net v3.1你的意思是什么?我似乎不能一次运行多个sql语句-如果我用sql语句创建一个长字符串,那么只有第一个似乎是单独运行的语句表示单独的字符串。