Подсчёт количества изменённых строк
int sqlite3_changes(sqlite3*); sqlite3_int64 sqlite3_changes64(sqlite3*);
Эти функции возвращают количество изменённых, добавленных или удалённых строк последним выполненным оператором INSERT, UPDATE или DELETE на базе данных, указанной единственным параметром. Эти две функции идентичны, за исключением типа возвращаемого значения и того, что если количество изменённых строк последним оператором INSERT, UPDATE или DELETE больше максимального значения, поддерживаемого типом "int", то возвращаемое значение sqlite3_changes() не определено. Выполнение любых других типов SQL-запросов не изменяет возвращаемое значение этих функций.
Учитываются только изменения, внесённые непосредственно оператором INSERT, UPDATE или DELETE — вспомогательные изменения, вызванные триггерами, действиями по внешним ключам или разрешением ограничения REPLACE, не учитываются.
Изменения в представлении, перехваченные триггерами INSTEAD OF, не учитываются. Возвращаемое значение sqlite3_changes() сразу после выполнения операторов INSERT, UPDATE или DELETE над представлением всегда равно нулю. Учитываются только изменения, внесённые в реальные таблицы.
Всё становится сложнее, если функция sqlite3_changes() выполняется во время работы программы-триггера. Это может произойти, если программа использует функцию SQL changes() или если какая-либо другая функция обратного вызова вызывает sqlite3_changes() напрямую. В сущности:
- Перед входом в программу-триггер возвращаемое значение функции sqlite3_changes() сохраняется. После завершения работы программы-триггера исходное значение восстанавливается.
- Внутри программы-триггера каждый оператор INSERT, UPDATE и DELETE устанавливает возвращаемое значение sqlite3_changes() при завершении как обычно. Разумеется, это значение не будет включать изменения, внесённые подтриггерами, так как значение sqlite3_changes() сохраняется и восстанавливается после выполнения каждого подтриггера.
Это означает, что если функция SQL changes() (или аналогичная) используется первым оператором INSERT, UPDATE или DELETE внутри триггера, она возвращает значение, установленное при начале выполнения вызываемого оператора. Если она используется вторым или последующим таким оператором внутри программы-триггера, возвращаемое значение отражает количество строк, изменённых предыдущим оператором INSERT, UPDATE или DELETE внутри того же триггера.
Если другой поток вносит изменения в ту же базу данных при выполнении sqlite3_changes(), то возвращаемое значение непредсказуемо и не имеет смысла.
См. также:
- интерфейс sqlite3_total_changes()
- псе count_changes
- функцию SQL changes()
- псе data_version
См. также списки объектов, констант и функций.
SQLite is in the Public Domain.
https://sqlite.org/c3ref/changes.html