УДАЛЕНИЕ
Содержание
1. Обзор
Команда DELETE удаляет записи из таблицы, идентифицированной qualified-table-name.
Если запрос WHERE отсутствует, удаляются все записи в таблице. Если указан запрос WHERE, то удаляются только те строки, для которых истинно выражение булево выражение запроса WHERE. Строки, для которых выражение ложно или NULL, сохраняются.
2. Ограничения на операторы DELETE в операторе CREATE TRIGGER
Следующие ограничения применяются к операторам DELETE, которые встречаются в теле оператора CREATE TRIGGER:
Имя таблицы (имя-таблицы), указанное в операторе DELETE в теле триггера, должно быть неопределённым. Другими словами, префикс имя-схемы. для имени таблицы не допускается в триггерах. Если таблица, к которой прикреплён триггер, не находится в базе данных temp, то операторы DELETE в теле триггера должны работать с таблицами в той же базе данных, что и сам триггер. Если таблица, к которой прикреплён триггер, находится в базе данных TEMP, тогда неопределённое имя удаляемой таблицы разрешается так же, как и для оператора верхнего уровня (сначала поиск в базе данных TEMP, затем в основной базе данных, а затем в других базах данных в порядке их присоединения).
-
Операторы INDEXED BY и NOT INDEXED не допускаются в операторах DELETE внутри триггеров.
-
Операторы LIMIT и ORDER BY (описанные ниже) не поддерживаются для операторов DELETE внутри триггеров.
Оператор RETURNING не поддерживается для триггеров.
3. Необязательные операторы LIMIT и ORDER BY
Если SQLite скомпилирован с опцией SQLITE_ENABLE_UPDATE_DELETE_LIMIT во время компиляции, тогда синтаксис оператора DELETE дополняется необязательными операторами ORDER BY и LIMIT:
Если в операторе DELETE есть условие LIMIT, максимальное количество строк, которые будут удалены, определяется путем оценки соответствующего выражения и приведения его к целочисленному значению. Если результат оценки условия LIMIT не может быть без потерь преобразован в целое число, это ошибка. Отрицательное значение LIMIT интерпретируется как «без ограничения». Если оператор DELETE также имеет условие OFFSET, то оно аналогично оценивается и приводится к целочисленному значению. Опять же, если значение не может быть без потерь преобразован в целое число, это ошибка. Если нет условия OFFSET или вычисленное целое значение отрицательное, эффективное значение OFFSET равно нулю.
Если в операторе DELETE есть условие ORDER BY, все строки, которые должны быть удалены в отсутствие условия LIMIT, сортируются в соответствии с ORDER BY. Первые M строк, где M — значение, полученное при оценке выражения условия OFFSET, пропускаются, а следующие N, где N — значение выражения LIMIT, удаляются. Если оставшихся строк меньше, чем N, после учета условия OFFSET, или если условие LIMIT оценилось в отрицательное значение, то удаляются все оставшиеся строки.
Если в операторе DELETE нет условия ORDER BY, все строки, которые должны быть удалены в отсутствие условия LIMIT, собираются в произвольном порядке перед применением условий LIMIT и OFFSET для определения подмножества, которое фактически удаляется.
Условие ORDER BY в операторе DELETE используется только для определения строк, попадающих в пределы условия LIMIT. Порядок удаления строк произвольный и не зависит от условия ORDER BY. Это означает, что если есть условие RETURNING, строки, возвращаемые оператором, вероятно, не будут в порядке, заданном условием ORDER BY.
4. Оптимизация Truncate
Когда в операторе DELETE опускаются клаузы WHERE и RETURNING, а удаляемая таблица не имеет триггеров, SQLite использует оптимизацию для удаления всего содержимого таблицы без необходимости посещения каждой строки таблицы индивидуально. Эта оптимизация «truncate» делает удаление намного быстрее. До версии SQLite 3.6.5 (2008-11-12), оптимизация truncate также означала, что интерфейсы sqlite3_changes() и sqlite3_total_changes(), а также pragma count_changes фактически не вернут количество строк, удаленных. Эта проблема была исправлена начиная с версии 3.6.5 (2008-11-12).
Оптимизацию truncate можно постоянно отключить для всех запросов, перекомпилировав SQLite с использованием параметра компиляции SQLITE_OMIT_TRUNCATE_OPTIMIZATION.
Оптимизацию truncate также можно отключить во время выполнения, используя интерфейс sqlite3_set_authorizer(). Если обратный вызов авторизатора возвращает SQLITE_IGNORE для кода действия SQLITE_DELETE, то операция DELETE будет продолжена, но оптимизация truncate будет проигнорирована, и строки будут удалены по одной.
Эта страница была последняя изменена 08.01.2022 05:02:57 UTC
SQLite is in the Public Domain.
https://sqlite.org/lang_delete.html