10

我正在使用 SQLite,我有一个属性表和一个子属性表。每个子属性都使用 fkPropertyId 列指向其父级。现在,要创建初始数据库,我有一个看起来像这样的脚本:

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

2 回答 2

30

使用last_insert_rowid功能:

SELECT last_insert_rowid();
于 2009-11-30T20:18:58.783 回答
4

好吧,我想出的解决方案使用了last_insert_rowidBen S 的函数:

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,.....);

不确定这是否是最好的方法,但它对我有用,并且它不使用任何额外的表来存储临时数据。

于 2009-12-03T17:39:56.370 回答