Spec-Zone.ru › SQLite

Подсчет количества измененных строк

int sqlite3_changes(sqlite3*);
sqlite3_int64 sqlite3_changes64(sqlite3*);

Эти функции возвращают количество строк, измененных, добавленных или удаленных последним завершенным оператором INSERT, UPDATE или DELETE в подключении к базе данных, указанном единственным параметром. Эти две функции идентичны, за исключением типа возвращаемого значения и того, что если количество строк, измененных последним оператором INSERT, UPDATE или DELETE, превышает максимальное значение, поддерживаемое типом "int", возвращаемое значение sqlite3_changes() не определено. Выполнение любого другого типа оператора SQL не изменяет значение, возвращаемое этими функциями. Для целей этого интерфейса оператор CREATE TABLE AS SELECT не считается оператором INSERT, UPDATE или DELETE, поэтому строки, добавленные в новую таблицу оператором CREATE TABLE AS SELECT, не учитываются.

Учитываются только изменения, непосредственно внесенные оператором 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()
  • pragma count_changes
  • функцию SQL changes()
  • pragma data_version

См. также списки объектов, констант и функций.

SQLite is in the Public Domain.
https://sqlite.org/c3ref/changes.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API