Если нет WHERE, все записи удалены. Если оператор Where поставляется, то
удалятся только те строки, для которых WHERE
boolean expression = true.
Сохраняются строки, для которых выражение false или NULL.
2. Ограничения DELETE в CREATE TRIGGER
Следующие ограничения относятся к операторам удаления, которые происходят в
теле CREATE TRIGGER:
table-name,
определенное как часть оператора удаления в теле триггера,
должно быть неквалифицированным. Другими словами, префикс
schema-name. имени таблицы не позволен в триггерах.
Если таблица, к которой привязан триггер,
не находится в базе данных temp, DELETE в триггере
должен воздействовать на таблицы в той же самой базе данных.
Если таблица, к которой привязан триггер,
находится в базе данных TEMP, то неквалифицированное название удаляемой
таблицы решено таким же образом, как для запроса верхнего уровня
(поиск сначала в БД TEMP, затем в main, затем просматривая
любые другие базы данных в порядке, в котором они были приложены).
INDEXED BY и NOT INDEXED не позволены в DELETE в триггере.
LIMIT и ORDER BY (описаны ниже)
не поддерживаются в DELETE в триггере.
RETURNING не поддерживается в триггере.
3.
LIMIT и ORDER BY
Если SQLite собран с опцией
SQLITE_ENABLE_UPDATE_DELETE_LIMIT, то синтаксис оператора удаления
расширен добавлением дополнительных пунктов ORDER BY и LIMIT:
Если у оператора удаления есть пункт LIMIT, максимальное количество строк,
которые будут удалены, найдено, оценив сопровождающее выражение и бросив его
к целочисленному значению. Если результат оценки пункта LIMIT не может быть
без потерь преобразован в целочисленное значение, это ошибка.
Отрицательное предельное значение интерпретируется как "no limit".
Если у оператора удаления также есть пункт OFFSET, то он так же оценен и
брошен к целочисленному значению. Ошибка, если значение не может быть без
потерь преобразовано в целое число.
Если нет никакого пункта OFFSET, или расчетное целочисленное значение
отрицательно, эффективное значение OFFSET = 0.
Если у оператора удаления есть пункт ORDER BY, то все строки, которые были
бы удалены в отсутствие пункта LIMIT, сортированы согласно ORDER BY. Первые
M строк, где M это значение, найденное, оценивая выражение
пункта OFFSET, пропускаются, а следующие N, где N это значение
выражения LIMIT, удалены. Если есть меньше N строк
после принятия во внимание пункта OFFSET, или если пункт LIMIT оценился к
отрицательной величине, то все остающиеся строки удалены.
Если у оператора удаления нет пункта ORDER BY, то все строки, которые были
бы удалены в отсутствие пункта LIMIT, собраны в произвольном порядке прежде,
чем применить LIMIT и OFFSET, чтобы определить подмножество, которое на
самом деле удалено.
ORDER BY в DELETE используется только, чтобы определить, какие строки
находятся в пределах LIMIT. Порядок удаления строк
произволен и не под влиянием пункта ORDER BY. Это означает, что если есть
RETURNING, строки, возвращенные
запросом, вероятно, не будут в порядке, определенном пунктом ORDER BY.
4.
Оптимизация Truncate
Когда оператор Where и пункт RETURNING пропущены, и у таблицы нет
триггеров, SQLite использует оптимизацию, чтобы стереть все содержание
таблицы, не имея необходимость посещать каждую строку индивидуально. Эта
оптимизация делает работу намного быстрее.
До SQLite version 3.6.5
(2008-11-12) оптимизация truncate также означала, что
sqlite3_changes(),
sqlite3_total_changes() и
count_changes pragma
на самом деле не возвратят количество удаленных строк.
Та проблема была решена с
version 3.6.5 (2008-11-12).
Оптимизация truncate может быть выключена для всех запросов,
повторно собрав SQLite с опцией времени компиляции
SQLITE_OMIT_TRUNCATE_OPTIMIZATION.
Оптимизация truncate может также быть отключена во время
выполнения, используя
sqlite3_set_authorizer().
Если отзыв авторизатора возвратит
SQLITE_IGNORE для кода действия
SQLITE_DELETE, DELETE
продолжится, но оптимизация truncate будет обойдена, и строки
будут удалены поштучно.