RussianLDP Рейтинг@Mail.ru
WebMoney: 
WMZ Z294115950220 
WMR R409981405661 
WME E134003968233 
Visa 
4274 3200 2453 6495 

Small. Fast. Reliable.
Choose any three.
DELETE

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 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:

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

Если у оператора удаления есть пункт 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 будет обойдена, и строки будут удалены поштучно.