![]() |
|
|||
WebMoney: WMZ Z294115950220 WMR R409981405661 WME E134003968233 |
Visa 4274 3200 2453 6495 |
У каждого входа в большинстве таблиц SQLite (кроме таблиц
WITHOUT ROWID)
есть уникальный 64-битный ключ целого числа со знаком, названный
"rowid". rowid всегда доступен как
необъявленная колонка под названием ROWID, OID или _ROWID_, пока те имена
также не используются явно заявленными колонками. Если у таблицы есть колонка
типа INTEGER PRIMARY KEY,
она другой псевдоним для rowid. Интерфейс sqlite3_last_insert_rowid(D) обычно возвращает
rowid нового успешного
INSERT в rowid-таблицу или
виртуальную таблицу на соединении с базой данных D.
Вставки в таблицы WITHOUT ROWID
не зарегистрированы. Если никакой успешный
INSERT
в rowid-таблицы никогда не происходил на соединении с базой данных D, то
sqlite3_last_insert_rowid(D) возвращает ноль. Кроме автоматической установки, когда строки вставляются в таблицы базы
данных, значение, возвращенное этой функцией, может быть установлено явно
через
sqlite3_set_last_insert_rowid(). Некоторые виртуальные внедрения таблицы могут вставить строки
в 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.
Choose any three.
SQLite C Interface
Последняя вставка Rowid
sqlite3_int64 sqlite3_last_insert_rowid(sqlite3*);