DELETE
qualified-table-name:
La sentencia DELETE elimina registros de una tabla identificada mediante el qualified-table-name.
Si la cláusula WHERE no está presente, se borran todos los registros de la tabla. Si se suministra una cláusula WHERE, entonces sólo se borrarán aquellas filas para las que el resultado de evaluar la cláusula WHERE como una expresión booleana sea verdadero.
Restricciones de las sentencias DELETE dentro de CREATE TRIGGER
Se aplican las siguientes restricciones a las sentencias DELETE cuando aparezcan en el cuerpo de una sentencia CREATE TRIGGER:
- El nombre de la tabla especificado como parte de una sentencia DELETE dentro del cuerpo de un disparador debe estár sin calificar. En otras palabras, el prefijo nombre-base-datos. en el nombre de la tabla no está permitido dentro de disparadores. Si la tabla a la que está asociado el disparador no está en la base de datos temporal, entonces las sentencias DELETE dentro del cuerpo del disparador deben operar dentro de la misma base de datos que él. Si la tabla a la que está asociado el disparador está en la base de datos temporal, entonces el nombre de la tabla sin calificar de la que se efectuará el borrado se resuelve del mismo modo que con las sentencias de mayor nivel (buscando primero en la base de datos temporal, despuén en la principal y finalmente en las bases de datos conectadas, en el mismo orden en que se conectaron).
- Las cláusulas INDEXED BY y NOT INDEXED no están permitidas en sentencias DELETE dentro de disparadores.
- Las cláusulas LIMIT y ORDER BY (descritas más abajo) no están soportadas para sentencias DELETE dentro de disparadores.
cláusulas LIMIT y ORDER BY opcionales
Si SQLite fue compilado con la opción SQLITE_ENABLE_UPDATE_DELETE_LIMIT, entonces la sintaxis para la sentencia DELETE está extendida para poder añadir cláusulas opcionales ORDER BY y LIMIT:
delete-stmt-limited:
Si una sentencia DELETE tiene una cláusula LIMIT, el número máximo de filas que serán borradas se calcula evaluando la expresión que contiene y convirtiéndola a un valor entero. Si el resultado de evaluar la cláusula LIMIT no puede convertirse a un valor entero sin pérdida, se produce un error. Un valor negativo de LIMIT se interpreta como "sin límite". Si la sentencia DELETE también tiene una cláusula OFFSET, entonces también se evalúa y se convierte a un valor entero. De nuevo, es un error si el valor no puede ser convertido a un entero sin pérdida. Si no existe una cláusula OFFSET, o el entero calculado es un valor negativo, el valor efectivo de OFFSET es cero.
Si la sentecia DELETE tiene una cláusula ORDER BY, entonces todas las filas que serían borradas si faltase la cláusula LIMIT se ordenan de acuerdo con el ORDER BY. Las primeras M filas, donde M es el valor resultante de evaluar la expresión de la cláusula OFFSET, se saltan, y las siguintes N, donde N es el valor de la expresión LIMIT, son eliminadas. Si quedan menos de N filas después de que las tomadas por la cláusula OFFSET, o si la cláusula LIMIT se evalúa a un valor negativo, se eliminan todas las filas restantes.
Si la sentencia DELETE no tiene una cláusula ORDER BY, entonces todas las filas que serían borradas en ausencia de la cláusula LIMIT se reunen en un orden arbitrario antes de aplicar las cláusulas LIMIT y OFFSET para determinar el subconjunto que será borrado.
La cláusula ORDER BY en una sentencia DELETE se usa sólo para determinar qué filas caen dentro del LIMIT. El orden en que las filas son borradas es arbitrario y no queda afectado por la cláusula ORDER BY.
La optimización de truncado
Cuando se omite el WHERE de una sentencia DELETE y la tabla que se está borrando no tiene disparadores, SQLite usa una optimización para borrar el contenido de la tabla completa sin tener que recorrer cada fila de la tabla individualmente. Esta optimización de "truncado" hace que la ejecución de borrado sea mucho más rápida. Antes de la versión 3.6.5 de SQLite, la optimización de truncado también hacía que las funciones sqlite3_changes() y sqlite3_total_changes() y el pragma count_changes pragma no retornarar el número correcto de filas borradas. Este problema fue corregido en la versión 3.6.5.
La optimización de truncado puede ser deshabilitada permanentemente para todas las consultas mediante un recompilador con la opción de compilación SQLITE_OMIT_TRUNCATE_OPTIMIZATION.
La optimización de truncado también puede ser deshabilitada usando la función sqlite3_set_authorizer. Si una retrollamada de autorización devuelve SQLITE_IGNORE para un código de acción SQLITE_DELETE, entonces la operación DELETE se realizará, pero la optimización de truncado no será invocada y las filas se eliminarán una a una.