Последний вставленный идентификатор строки
sqlite3_int64 sqlite3_last_insert_rowid(sqlite3*);
Каждая запись в большинстве таблиц SQLite (за исключением таблиц WITHOUT ROWID) имеет уникальный 64-битный подписанный целочисленный ключ, называемый "rowid". Значение rowid всегда доступно в качестве не объявленного столбца под именем ROWID, OID или _ROWID_, если эти имена не используются также в явных столбцах. Если таблица имеет столбец типа INTEGER PRIMARY KEY, то этот столбец является псевдонимом для rowid.
Интерфейс sqlite3_last_insert_rowid(D) обычно возвращает rowid последней успешной операции INSERT в таблицу с rowid или виртуальную таблицу на подключении к базе данных D. Вставки в таблицы WITHOUT ROWID не регистрируются. Если на подключении к базе данных D никогда не было успешных операций INSERT в таблицы с rowid, то sqlite3_last_insert_rowid(D) возвращает ноль.
Помимо автоматической установки при вставке строк в таблицы базы данных, значение, возвращаемое этой функцией, может быть установлено явно с помощью sqlite3_set_last_insert_rowid().
Некоторые реализации виртуальных таблиц могут выполнять INSERT в таблицы с rowid в рамках подтверждения транзакции (например, для записи данных, накопленных в памяти, на диск). В этом случае последующие вызовы этой функции возвращают rowid, связанный с этими внутренними операциями INSERT, что приводит к неинтуитивным результатам. Реализации виртуальных таблиц, которые записывают в таблицы с rowid таким образом, могут избежать этой проблемы, восстановив исходное значение rowid с помощью sqlite3_set_last_insert_rowid() перед возвращением управления пользователю.
Если INSERT происходит внутри триггера, то эта функция вернёт rowid вставленной строки, пока триггер выполняется. После завершения программы триггера, возвращаемое значение этой функции возвращается к значению, которое было до запуска триггера.
INSERT, который терпит неудачу из-за нарушения ограничения, не является успешной операцией INSERT и не изменяет возвращаемое значение этой функции. Таким образом, INSERT OR FAIL, INSERT OR IGNORE, INSERT OR ROLLBACK и INSERT OR ABORT не вносят изменений в возвращаемое значение этой функции при неудачной вставке. Когда INSERT OR REPLACE сталкивается с нарушением ограничения, он не терпит неудачу. INSERT выполняется до конца после удаления строк, вызвавших проблему ограничения, поэтому INSERT OR REPLACE всегда изменяет возвращаемое значение этого интерфейса.
Для целей этой функции INSERT считается успешным, даже если он впоследствии отменён.
Доступ к этой функции возможен через операторы SQL с помощью функции SQL last_insert_rowid().
Если отдельный поток выполняет новую операцию INSERT на том же подключении к базе данных во время выполнения функции sqlite3_last_insert_rowid(), и, следовательно, изменяет последний вставленный rowid, то возвращаемое значение функции sqlite3_last_insert_rowid() является непредсказуемым и может не совпадать ни со старым, ни с новым последним вставленным rowid.
См. также списки Объектов, Констант и Функций.
SQLite is in the Public Domain.
https://sqlite.org/c3ref/last_insert_rowid.html