小巧、快速、可靠。
三选二。

SQLite C 接口

确定 SQL 语句是否写入数据库

int sqlite3_stmt_readonly(sqlite3_stmt *pStmt);

如果且仅当 预备语句 X 不对数据库文件内容进行直接更改时,sqlite3_stmt_readonly(X) 接口返回 true(非零)。

请注意,应用程序定义的 SQL 函数虚拟表 可能作为副作用间接更改数据库。例如,如果应用程序定义了一个名为 "eval()" 的函数,该函数调用 sqlite3_exec(),那么以下 SQL 语句将通过副作用更改数据库文件。

SELECT eval('DELETE FROM t1') FROM t2;

但是,由于 SELECT 语句不会直接更改数据库文件,因此 sqlite3_stmt_readonly() 仍然会返回 true。

诸如 BEGINCOMMITROLLBACKSAVEPOINTRELEASE 之类的交易控制语句会导致 sqlite3_stmt_readonly() 返回 true,因为语句本身不会实际修改数据库,而是控制其他语句修改数据库的时间。 ATTACHDETACH 语句也会导致 sqlite3_stmt_readonly() 返回 true,因为虽然这些语句会更改数据库连接的配置,但它们不会对磁盘上的数据库文件内容进行更改。sqlite3_stmt_readonly() 接口对于 BEGIN 返回 true,因为 BEGIN 只是设置内部标志,但 BEGIN IMMEDIATEBEGIN EXCLUSIVE 命令确实会触及数据库,因此 sqlite3_stmt_readonly() 对于这些命令返回 false。

如果存在任何可能性表明语句可能会更改数据库文件,则此例程将返回 false。false 返回不保证语句会更改数据库文件。例如,UPDATE 语句可能包含一个 WHERE 子句,使其成为无操作,但 sqlite3_stmt_readonly() 的结果仍然为 false。类似地,如果表已存在,则 CREATE TABLE IF NOT EXISTS 语句是只读无操作,但 sqlite3_stmt_readonly() 对于此类语句仍然返回 false。

如果预备语句 X 是 EXPLAINEXPLAIN QUERY PLAN 语句,则 sqlite3_stmt_readonly(X) 返回与省略 EXPLAIN 或 EXPLAIN QUERY PLAN 前缀时相同的值。

另请参阅 对象常量函数 的列表。