小巧、快速、可靠。
選擇三項。
刪除

1. 概觀

delete-stmt

WITH RECURSIVE common-table-expression , DELETE FROM qualified-table-name returning-clause expr WHERE

common-table-expression

expr

qualified-table-name

returning-clause

DELETE 指令會從 qualified-table-name 所識別的表格中移除記錄。

如果沒有 WHERE 子句,表格中的所有記錄都會被刪除。如果提供了 WHERE 子句,則只會刪除 WHERE 子句 布林表達式 為 true 的那些列。表達式為 false 或 NULL 的列會被保留。

2. CREATE TRIGGER 中 DELETE 陳述式的限制

以下限制適用於出現在 CREATE TRIGGER 陳述式主體中的 DELETE 陳述式

3. 選用的 LIMIT 和 ORDER BY 子句

如果 SQLite 是使用 SQLITE_ENABLE_UPDATE_DELETE_LIMIT 編譯時間選項編譯的,則 DELETE 陳述式的語法會透過加入選用的 ORDER BY 和 LIMIT 子句來擴充

delete-stmt-limited

WITH RECURSIVE common-table-expression , DELETE FROM qualified-table-name WHERE expr returning-clause ORDER BY ordering-term , LIMIT expr OFFSET expr , expr

如果 DELETE 陳述式有 LIMIT 子句,則會透過評估附帶的表達式並將其轉換為整數值來找出將刪除的最大列數。如果評估 LIMIT 子句的結果無法無損失地轉換為整數值,則會產生錯誤。負面的 LIMIT 值會被解釋為「沒有限制」。如果 DELETE 陳述式也有 OFFSET 子句,則會以類似的方式評估並轉換為整數值。同樣地,如果值無法無損失地轉換為整數,則會產生錯誤。如果沒有 OFFSET 子句,或計算出的整數值為負值,則有效的 OFFSET 值為零。

如果 DELETE 敘述具有 ORDER BY 子句,則在沒有 LIMIT 子句的情況下,將會刪除的所有列會根據 ORDER BY 來排序。會略過前 M 列,其中 M 是透過評估 OFFSET 子句表達式找到的值,並刪除後面的 N,其中 N 是 LIMIT 表達式的值。如果在考量 OFFSET 子句後,剩餘的列少於 N,或 LIMIT 子句評估為負值,則會刪除所有剩餘的列。

如果 DELETE 敘述沒有 ORDER BY 子句,則在沒有 LIMIT 子句的情況下,將會刪除的所有列會在套用 LIMIT 和 OFFSET 子句以判定實際刪除的子集之前,以任意順序組合。

DELETE 敘述中的 ORDER BY 子句僅用於判定哪些列在 LIMIT 範圍內。刪除列的順序是任意的,不受 ORDER BY 子句影響。這表示如果有一個 RETURNING 子句,則敘述所傳回的列可能不會按照 ORDER BY 子句指定的順序排列。

4. Truncate 最佳化

當 WHERE 子句和 RETURNING 子句都從 DELETE 敘述中省略,且要刪除的表格沒有觸發器時,SQLite 會使用最佳化來清除整個表格內容,而不必個別拜訪表格的每一列。這個「truncate」最佳化讓刪除執行得更快。在 SQLite 版本 3.6.5 (2008-11-12) 之前,truncate 最佳化也表示 sqlite3_changes()sqlite3_total_changes() 介面,以及 count_changes pragma 實際上不會傳回已刪除列的數量。這個問題已在 版本 3.6.5 (2008-11-12) 中修正。

透過重新編譯 SQLite 並使用 SQLITE_OMIT_TRUNCATE_OPTIMIZATION 編譯時間開關,可以永久停用所有查詢的截斷最佳化。

也可以使用 sqlite3_set_authorizer() 介面在執行階段停用截斷最佳化。如果授權回呼函式傳回 SQLITE_IGNORESQLITE_DELETE 動作碼,則 DELETE 作業會繼續進行,但會略過截斷最佳化,並逐一刪除列。

此頁面最後修改於 2022-01-08 05:02:57 UTC