Small. Fast. Reliable.
Choose any three.
删除

1.概述

delete-stmt:

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

common-table-expression:

expr:

限定表名称:

返回条款:

DELETE命令从由qualified-table-name标识的表中删除记录 。

如果WHERE子句不存在,则删除表中的所有记录。如果提供了WHERE子句,则仅删除WHERE子句布尔表达式为true的那些行。保留表达式为false或NULL的行。

2.在CREATE TRIGGER中对DELETE语句的限制

以下限制适用于在CREATE TRIGGER语句内出现的DELETE语句:

3.可选的LIMIT和ORDER BY子句

如果使用SQLITE_ENABLE_UPDATE_DELETE_LIMIT 编译时选项编译SQLite ,则通过添加可选的ORDER BY和LIMIT子句来扩展DELETE语句的语法:

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子句,则将根据ORDER BY对在缺少LIMIT子句的情况下将要删除的所有行进行排序。跳过前M行,其中M是通过评估OFFSET子句表达式找到的值,而后 N(其中N是LIMIT表达式的值)被删除。如果在考虑了OFFSET子句之后剩余少于N行,或者如果LIMIT子句评估为负值,则将删除所有剩余的行。

如果DELETE语句没有ORDER BY子句,则在应用LIMIT和OFFSET子句以确定实际删除的子集之前,将在不存在LIMIT子句的情况下删除的所有行以任意顺序组合。

DELETE语句上的ORDER BY子句仅用于确定哪些行在LIMIT之内。行的删除顺序是任意的,不受ORDER BY子句的影响。这意味着,如果存在RETURNING子句,则该语句返回的行可能不会按照ORDER BY子句指定的顺序。

4.截断优化

当从DELETE语句中省略WHERE子句和RETURNING子句,并且要删除的表没有触发器时,SQLite将使用优化来擦除整个表内容,而不必分别访问表的每一行。这种“截断”优化使删除运行更快。在SQLite 3.6.5(2008-11-12)版本之前,截断优化还意味着sqlite3_changes()sqlite3_total_changes()接口以及count_changes编译指示 实际上不会返回已删除的行数。从3.6.5版(2008-11-12)开始,此问题已修复。

通过使用SQLITE_OMIT_TRUNCATE_OPTIMIZATION编译时开关重新编译SQLite,可以永久禁用所有查询的截断优化。

截断优化也可以在运行时使用sqlite3_set_authorizer()接口禁用。如果授权者回调为SQLITE_DELETE操作代码返回SQLITE_IGNORE,则DELETE操作将继续进行,但截断优化将被绕过,行将被一一删除。