Как я могу получить доступ к последнему вставленному идентификатору строки в сценарии SQL? - PullRequest
9 голосов
/ 30 ноября 2009

Я использую 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)

Есть ли лучший (и более технически точный) способ написания этого сценария?

Ответы [ 2 ]

29 голосов
/ 30 ноября 2009

Используйте функцию last_insert_rowid:

SELECT last_insert_rowid();
4 голосов
/ 03 декабря 2009

Ну, решение, которое я придумал, использовало функцию last_insert_rowid от Ben 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,.....);

Не уверен, что это лучший подход, но он работает для меня и не использует никаких дополнительных таблиц для временного хранения данных.

...