2017-06-04 64 views
0

我试图在同一时间插入一个父母和孩子。SQLite插入表使用内部插入的ID

我的想法是插入父,使用SELECT last_insert_rowid() AS [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] 
); 

我得到这个错误:

near "SELECT": syntax error:

任何人都可以点我在正确的方向?

+0

从SQLite使用哪种语言? –

+0

我正在使用C#谢谢。 – Rick

+0

您使用了哪种C#SQLite数据库驱动程序? –

回答

1

您不能在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; 

或者你可以创建一个永久性的表,这影响。

+0

我刚刚使用这种方法进行测试 - 问题是我有数百名儿童插入 - 使用'last_insert_rowid'再次导致id为前一个孩子 - 我需要某种变量来存储父ID以便在子插入中使用。我不认为SQLite有变量?纠正我,如果我错了 – Rick

+0

查看编辑答案 –

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是一个嵌入式数据库,并且没有客户端/服务器的通信开销;没有理由去尝试一切挤进单个语句。)

+0

我似乎无法一次运行多个sql语句 - 如果我用SQL语句创建一个长字符串,那么只有第一个似乎运行 – Rick

+0

单独的语句表示单独的字符 –