我正在尝试同时插入父母和孩子。
我的想法是插入父级,使用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”:语法错误:
有人能指出我正确的方向吗?
答案 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是一个嵌入式数据库,没有客户端/服务器通信开销;没有理由尝试将所有内容都压缩到一个语句中。)