SQLite C 接口
计算修改的行数
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 触发器拦截的视图更改 。在视图上运行 INSERT、UPDATE 或 DELETE 语句后,sqlite3_changes() 立即返回的值始终为零。只计算对真实表所做的更改。
如果在触发器程序运行时执行 sqlite3_changes() 函数,事情会更加复杂。如果程序使用changes() SQL 函数,或者如果某些其他回调函数直接调用 sqlite3_changes(),则可能会发生这种情况。本质上:
- 在进入触发器程序之前,sqlite3_changes() 函数返回的值被保存。触发程序完成后,恢复原始值。
- 在触发器程序中,每个 INSERT、UPDATE 和 DELETE 语句在正常完成时设置 sqlite3_changes() 返回的值。当然,这个值不包括子触发器执行的任何更改,因为 sqlite3_changes() 值将在每个子触发器运行后保存和恢复。
这意味着如果触发器中的第一个 INSERT、UPDATE 或 DELETE 语句使用 changes() SQL 函数(或类似函数),它会返回调用语句开始执行时设置的值。如果它被触发器程序中的第二个或后续此类语句使用,则返回的值反映由同一触发器中的前一个 INSERT、UPDATE 或 DELETE 语句修改的行数。
如果一个单独的线程在sqlite3_changes()运行时对同一个数据库连接进行更改,则返回的值是不可预测的并且没有意义。
也可以看看:
- sqlite3_total_changes( )接口
- count_changes编译指示
- changes ( ) SQL 函数
- data_version杂注