2009-11-30 51 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

相关问题