小巧、快速、可靠。
選擇其中三項。

SQLite C 介面

判斷 SQL 陳述式是否寫入資料庫

int sqlite3_stmt_readonly(sqlite3_stmt *pStmt);

sqlite3_stmt_readonly(X) 介面會傳回 true(非零值),若且唯若已準備好的陳述式 X 不會直接更改資料庫檔案的內容。

請注意,應用程式定義的 SQL 函式虛擬表格可能會間接更改資料庫作為副作用。例如,如果應用程式定義了一個呼叫 sqlite3_exec() 的函式「eval()」,則以下 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 前綴詞時相同的值。

另請參閱物件常數函式的列表。