我正在使用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)
有没有更好的(技术上更准确)的方式来编写这个脚本?
答案 0 :(得分:29)
使用last_insert_rowid
功能:
SELECT last_insert_rowid();
答案 1 :(得分: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,.....);
不确定这是否是最佳方法,但它适用于我,并且它不会使用任何额外的表进行临时数据存储。