1. 概觀
delete-stmt
hide
WITH
RECURSIVE
common-table-expression
,
DELETE
FROM
qualified-table-name
returning-clause
expr
WHERE
common-table-expression
show
table-name
(
column-name
)
AS
NOT
MATERIALIZED
(
select-stmt
)
,
select-stmt
show
WITH
RECURSIVE
common-table-expression
,
SELECT
DISTINCT
result-column
,
ALL
FROM
table-or-subquery
join-clause
,
WHERE
expr
GROUP
BY
expr
HAVING
expr
,
WINDOW
window-name
AS
window-defn
,
VALUES
(
expr
)
,
,
compound-operator
select-core
ORDER
BY
LIMIT
expr
ordering-term
,
OFFSET
expr
,
expr
compound-operator
show
UNION
UNION
INTERSECT
EXCEPT
ALL
join-clause
show
table-or-subquery
join-operator
table-or-subquery
join-constraint
join-constraint
show
USING
(
column-name
)
,
ON
expr
join-operator
show
NATURAL
LEFT
OUTER
JOIN
,
RIGHT
FULL
INNER
CROSS
ordering-term
show
expr
COLLATE
collation-name
DESC
ASC
NULLS
FIRST
NULLS
LAST
result-column
show
expr
AS
column-alias
*
table-name
.
*
table-or-subquery
show
schema-name
.
table-name
AS
table-alias
INDEXED
BY
index-name
NOT
INDEXED
table-function-name
(
expr
)
,
AS
table-alias
(
select-stmt
)
(
table-or-subquery
)
,
join-clause
window-defn
show
(
base-window-name
PARTITION
BY
expr
,
ORDER
BY
ordering-term
,
frame-spec
)
frame-spec
show
GROUPS
BETWEEN
UNBOUNDED
PRECEDING
AND
UNBOUNDED
FOLLOWING
RANGE
ROWS
UNBOUNDED
PRECEDING
expr
PRECEDING
CURRENT
ROW
expr
PRECEDING
CURRENT
ROW
expr
FOLLOWING
expr
PRECEDING
CURRENT
ROW
expr
FOLLOWING
EXCLUDE
CURRENT
ROW
EXCLUDE
GROUP
EXCLUDE
TIES
EXCLUDE
NO
OTHERS
expr
show
literal-value
bind-parameter
schema-name
.
table-name
.
column-name
unary-operator
expr
expr
binary-operator
expr
function-name
(
function-arguments
)
filter-clause
over-clause
(
expr
)
,
CAST
(
expr
AS
type-name
)
expr
COLLATE
collation-name
expr
NOT
LIKE
GLOB
REGEXP
MATCH
expr
expr
ESCAPE
expr
expr
ISNULL
NOTNULL
NOT
NULL
expr
IS
NOT
DISTINCT
FROM
expr
expr
NOT
BETWEEN
expr
AND
expr
expr
NOT
IN
(
select-stmt
)
expr
,
schema-name
.
table-function
(
expr
)
table-name
,
NOT
EXISTS
(
select-stmt
)
CASE
expr
WHEN
expr
THEN
expr
ELSE
expr
END
raise-function
filter-clause
show
function-arguments
show
DISTINCT
expr
,
*
ORDER
BY
ordering-term
,
ordering-term
show
expr
COLLATE
collation-name
DESC
ASC
NULLS
FIRST
NULLS
LAST
literal-value
show
CURRENT_TIMESTAMP
numeric-literal
string-literal
blob-literal
NULL
TRUE
FALSE
CURRENT_TIME
CURRENT_DATE
over-clause
show
OVER
window-name
(
base-window-name
PARTITION
BY
expr
,
ORDER
BY
ordering-term
,
frame-spec
)
frame-spec
show
GROUPS
BETWEEN
UNBOUNDED
PRECEDING
AND
UNBOUNDED
FOLLOWING
RANGE
ROWS
UNBOUNDED
PRECEDING
expr
PRECEDING
CURRENT
ROW
expr
PRECEDING
CURRENT
ROW
expr
FOLLOWING
expr
PRECEDING
CURRENT
ROW
expr
FOLLOWING
EXCLUDE
CURRENT
ROW
EXCLUDE
GROUP
EXCLUDE
TIES
EXCLUDE
NO
OTHERS
ordering-term
show
expr
COLLATE
collation-name
DESC
ASC
NULLS
FIRST
NULLS
LAST
raise-function
show
RAISE
(
ROLLBACK
,
error-message
)
IGNORE
ABORT
FAIL
select-stmt
show
WITH
RECURSIVE
common-table-expression
,
SELECT
DISTINCT
result-column
,
ALL
FROM
table-or-subquery
join-clause
,
WHERE
expr
GROUP
BY
expr
HAVING
expr
,
WINDOW
window-name
AS
window-defn
,
VALUES
(
expr
)
,
,
compound-operator
select-core
ORDER
BY
LIMIT
expr
ordering-term
,
OFFSET
expr
,
expr
compound-operator
show
UNION
UNION
INTERSECT
EXCEPT
ALL
join-clause
show
table-or-subquery
join-operator
table-or-subquery
join-constraint
join-constraint
show
USING
(
column-name
)
,
ON
expr
join-operator
show
NATURAL
LEFT
OUTER
JOIN
,
RIGHT
FULL
INNER
CROSS
ordering-term
show
expr
COLLATE
collation-name
DESC
ASC
NULLS
FIRST
NULLS
LAST
result-column
show
expr
AS
column-alias
*
table-name
.
*
table-or-subquery
show
schema-name
.
table-name
AS
table-alias
INDEXED
BY
index-name
NOT
INDEXED
table-function-name
(
expr
)
,
AS
table-alias
(
select-stmt
)
(
table-or-subquery
)
,
join-clause
window-defn
show
(
base-window-name
PARTITION
BY
expr
,
ORDER
BY
ordering-term
,
frame-spec
)
frame-spec
show
GROUPS
BETWEEN
UNBOUNDED
PRECEDING
AND
UNBOUNDED
FOLLOWING
RANGE
ROWS
UNBOUNDED
PRECEDING
expr
PRECEDING
CURRENT
ROW
expr
PRECEDING
CURRENT
ROW
expr
FOLLOWING
expr
PRECEDING
CURRENT
ROW
expr
FOLLOWING
EXCLUDE
CURRENT
ROW
EXCLUDE
GROUP
EXCLUDE
TIES
EXCLUDE
NO
OTHERS
type-name
show
name
(
signed-number
,
signed-number
)
(
signed-number
)
signed-number
show
qualified-table-name
show
schema-name
.
table-name
AS
alias
INDEXED
BY
index-name
NOT
INDEXED
returning-clause
show
RETURNING
expr
AS
column-alias
*
,
DELETE 指令會從 qualified-table-name 所識別的表格中移除記錄。
如果沒有 WHERE 子句,表格中的所有記錄都會被刪除。如果提供了 WHERE 子句,則只會刪除 WHERE 子句 布林表達式 為 true 的那些列。表達式為 false 或 NULL 的列會被保留。
2. CREATE TRIGGER 中 DELETE 陳述式的限制
以下限制適用於出現在 CREATE TRIGGER 陳述式主體中的 DELETE 陳述式
在觸發器主體中作為 DELETE 陳述式一部分指定的 table-name 必須是不限定的。換句話說,表名稱上的 schema-name . 前綴在觸發器中是不允許的。如果附加觸發器的表不在 temp 資料庫中,則觸發器主體中的 DELETE 陳述式必須對與其在同一個資料庫中的表進行操作。如果附加觸發器的表在 TEMP 資料庫中,則會以與頂層陳述式相同的方式解析要刪除的表的非限定名稱(先搜尋 TEMP 資料庫,然後搜尋主資料庫,然後按附加順序搜尋其他任何資料庫)。
在觸發器中的 DELETE 陳述式上不允許使用 INDEXED BY 和 NOT INDEXED 子句。
在觸發器中的 DELETE 陳述式不支援 LIMIT 和 ORDER BY 子句(如下所述)。
觸發器不支援 RETURNING 子句。
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_IGNORE 給 SQLITE_DELETE 動作碼,則 DELETE 作業會繼續進行,但會略過截斷最佳化,並逐一刪除列。
此頁面最後修改於 2022-01-08 05:02:57 UTC