Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用内部插入的id将SQLite插入到表中_Sqlite - Fatal编程技术网

使用内部插入的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语句创建一个长字符串,那么只有第一个似乎是单独运行的语句表示单独的字符串。