2017-06-04 66 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

單獨的語句表示單獨的字符 –