2009-11-30 41 views
8

我正在使用SQLite,並且我有一個屬性表和一個子屬性表。每個子屬性使用fkPropertyId列指向其父項。眼下,創建初始數據庫,我有一個腳本,看起來像這樣:如何訪問SQL腳本中最後插入的行ID?

INSERT INTO property VALUES(1,.....); 
INSERT INTO property VALUES(2,.....); 
INSERT INTO property VALUES(3,.....); 
    INSERT INTO subproperty VALUES(1,.....,3); 
    INSERT INTO subproperty VALUES(2,.....,3); 
    INSERT INTO subproperty VALUES(3,.....,3); 
INSERT INTO property VALUES(4,.....); 

現在,我想擺脫硬編碼ROWID的,所以它會是這樣的:

INSERT INTO property VALUES(NULL,.....); 
INSERT INTO property VALUES(NULL,.....); 
INSERT INTO property VALUES(NULL,.....); 
    INSERT INTO subproperty VALUES(NULL,.....,X); 
    INSERT INTO subproperty VALUES(NULL,.....,X); 
    INSERT INTO subproperty VALUES(NULL,.....,X); 
INSERT INTO property VALUES(NULL,.....); 

其中x表示屬性表中最後插入的rowId。現在,這是

(SELECT MAX(rowId) FROM property) 

有沒有更好的技術上更準確的方法來寫這個腳本?

回答

4

好吧,我想出了使用距離Ben S中last_insert_rowid功能的解決方案:

INSERT INTO property VALUES(NULL,.....); 
INSERT INTO property VALUES(NULL,.....); 

    INSERT INTO subproperty VALUES(1,.....,-1); 
    INSERT INTO subproperty VALUES(2,.....,-1); 
    INSERT INTO subproperty VALUES(3,.....,-1); 
INSERT INTO property VALUES(NULL,.....); 
UPDATE subproperty SET fkPropertyId = (SELECT last_insert_rowid()) WHERE fkPropertyId=-1; 

INSERT INTO property VALUES(NULL,.....); 

不知道這是最好的方法,但它的工作原理對我而言,它不會爲臨時數據存儲使用任何額外的表格。

26

使用last_insert_rowid功能:

SELECT last_insert_rowid(); 
+0

如何保持連續三次插入的值? – 2009-11-30 20:19:42

+0

只需先插入屬性行,然後再插入子屬性。如果您需要記住多個插入的屬性ID,請在執行子屬性插入之前將其分配給變量。 – 2009-11-30 20:22:55

+1

我的問題是,這是一個sqlite腳本,據我所知,sqlite不支持腳本中的用戶變量 – 2009-11-30 20:32:43