Spec-Zone.ru › SQLite

УДАЛЕНИЕ

Содержание
1. Обзор
2. Ограничения для операторов DELETE в триггере CREATE
3. Необязательные предложения LIMIT и ORDER BY
4. Оптимизация обрезки

1. Обзор

delete-stmt:

С РЕКУРСИВНЫМ выражение_общего_табличного_выражения , УДАЛИТЬ ИЗ имя_квалифицированной_таблицы предложение_возврата выражение ГДЕ

общее_табличное_выражение:

имя_таблицы ( имя_столбца ) КАК НЕ МАТЕРИАЛИЗОВАННАЯ ( запрос ) ,

запрос:

С РЕКУРСИВНАЯ common-table-expression , ВЫБЕРИТЕ РАЗЛИЧНЫЕ столбец-результата , ВСЕ ИЗ таблицы-или-подзапроса оператор-соединения , ГДЕ выражение СГРУППИРУЙТЕ ПО выражение ПРИ выражение ,
OKНО имя-окна КАК определение-окна , ЗНАЧЕНИЯ ( выражение ) , , оператор-составное select-core ПОРЯДОК ПО ОГРАНИЧЕНИЕ выражение член-упорядочивания , СМЕЩЕНИЕ выражение , выражение

оператор-составное:

ОБЪЕДИНЕНИЕ ОБЪЕДИНЕНИЕ ПЕРЕСЕЧЕНИЕ ИСКЛЮЧЕНИЕ ВСЕ

оператор объединения:

table-or-subquery join-operator table-or-subquery join-constraint

join-constraint:

USING ( column-name ) , ON expr

join-operator:

NATURAL LEFT OUTER JOIN , RIGHT FULL INNER CROSS

join-operator:

NATURAL LEFT OUTER JOIN , <path class="stroke" d="M189,41L5
expr COLLATE имя_сортировки ОБРАТНО ВПЕРЁД NULL первым NULL последним

столбец_результата:

expr КАК псевдоним_столбца * имя_таблицы . *

таблица_или_подзапрос:

имя-схемы . название-таблицы КАК псевдоним-таблицы ИНДЕКСИРОВАН ПО имя-индекса НЕ ИНДЕКСИРОВАН имя-функции-таблицы ( выражение ) , КАК псевдоним-таблицы ( запрос-выбор ) ( таблица-или-подзапрос ) ,
условие_соединения

определение_окна:

( имя_основного_окна РАЗДЕЛ ПО выражение , ПОРЯДОК ПО элемент_упорядочения , описание_кадра )

описание_кадра:

ГРУППЫ МЕЖДУ НЕОГРАНИЧЕННЫЙ ПРЕДШЕСТВУЮЩИЙ И НЕОГРАНИЧЕННЫЙ СЛЕДУЮЩИЙ ДИАПАЗОН СТРОКИ НЕОГРАНИЧЕННЫЙ ПРЕДШЕСТВУЮЩИЙ expr ПРЕДШЕСТВУЮЩИЙ ТЕКУЩИЙ СТРОКА expr ПРЕДШЕСТВУЮЩИЙ ТЕКУЩИЙ СТРОКА expr СЛЕДУЮЩИЙ expr ПРЕДШЕСТВУЮЩИЙ ТЕКУЩИЙ СТРОКА expr СЛЕДУЮЩИЙ
ИСКЛЮЧАТЬ ТЕКУЩИЙ СТРОКА ИСКЛЮЧАТЬ ГРУППА ИСКЛЮЧАТЬ СВЯЗИ ИСКЛЮЧАТЬ НЕТ ДРУГИЕ

expr:

литеральное значение связываемый параметр имя схемы . имя таблицы . имя столбца унарный оператор expr expr бинарный оператор expr имя функции ( аргументы функции ) фильтрующее предложение over-предложение ( expr ) , CAST ( expr AS имя типа
) expr COLLATE имя_сортировки expr НЕ ПОДОБНО GLOB REGEXP MATCH expr expr ESCAPE expr expr ISNULL NOTNULL НЕ NULL expr ЕСТЬ НЕ РАЗЛИЧНЫЕ ОТ expr
expr НЕ МЕЖДУ expr И expr expr НЕ В ( выражение-select ) expr , имя-схемы . функция-таблицы ( expr ) имя-таблицы , НЕ СУЩЕСТВУЕТ ( выражение-select )
CASE expr WHEN expr THEN expr ELSE expr END raise-функция

оператор фильтрации:

ФИЛЬТР ( ГДЕ выражение )

аргументы функции:

DISTINCT expr , * ORDER BY ordering-term ,

ordering-term:

expr COLLATE collation-name DESC ASC NULLS FIRST NULLS LAST

literal-value:

CURRENT_TIMESTAMP numeric-literal string-literal blob-literal NULL TRUE FALSE CURRENT_TIME CURRENT_DATE

over-оператор:

ПЕРЕД имя-окна ( имя-основного-окна РАЗДЕЛЁННЫЙ ПО выражение , ПОРЯДОК ПО элемент-порядка , спецификация-кадра )

спецификация-кадра:

ГРУППЫ МЕЖДУ НЕОГРАНИЧЕННЫМ ПРЕДЫДУЩИМ И НЕОГРАНИЧЕННЫМ ПОСЛЕДУЮЩИМ ДИАПАЗОН СТРОКИ НЕОГРАНИЧЕННЫМ ПРЕДЫДУЩИМ expr ПРЕДЫДУЩИМ ТЕКУЩАЯ СТРОКА expr ПРЕДЫДУЩИМ ТЕКУЩАЯ СТРОКА expr ПОСЛЕДУЮЩИМ expr ПРЕДЫДУЩИМ ТЕКУЩАЯ СТРОКА expr ПОСЛЕДУЮЩИМ
ИСКЛЮЧАТЬ ТЕКУЩИЙ РЯД ИСКЛЮЧАТЬ ГРУППА ИСКЛЮЧАТЬ СВЯЗИ ИСКЛЮЧАТЬ НЕТ ДРУГИЕ

ordering-term:

expr СОРТИРОВКА имя_сортировки ПОНИЖАЮЩЕ ВОЗРАСТАЮЩЕ NULL ПЕРВЫЙ NULL ПОСЛЕДНИЙ

raise-function:

ПОДНЯТЬ ( ОТКАТ , сообщение_об_ошибке ) ИГНОРИРОВАТЬ ПРЕКРАТИТЬ НЕУДАЧА

заявление_select:

С РЕКУРСИВНАЯ общий-табличный-выражение , ВЫБЕРИТЕ УНИКАЛЬНЫЕ столбец-результата , ВСЕ ИЗ таблицы-или-подзапроса условие-соединения , ГДЕ выражение СГРУППИРУЙТЕ ПО выражение С УСЛОВИЕМ выражение ,
ОКНО имя-окна КАК определение-окна , ЗНАЧЕНИЯ ( выражение ) , , комбинированный-оператор select-core ПОРЯДОК ПО ЛИМИТ выражение термин-сортировки , СМЕЩЕНИЕ выражение , выражение

комбинированный-оператор:

ОБЪЕДИНЕНИЕ ОБЪЕДИНЕНИЕ ПЕРЕСЕЧЕНИЕ ИСКЛЮЧЕНИЕ ВСЕ

запрос со связыванием:

table-or-subquery join-operator table-or-subquery join-constraint

join-constraint:

USING ( column-name ) , ON expr

join-operator:

NATURAL LEFT OUTER JOIN , RIGHT FULL INNER CROSS

ordering-term:

expr COLLATE collation-name DESC ASC NULLS FIRST NULLS LAST

result-column:

expr AS имя_псевдонима_колонки * имя_таблицы . *

таблица_или_подзапрос:

schema-name . table-name AS table-alias INDEXED BY index-name NOT INDEXED table-function-name ( expr ) , AS table-alias ( select-stmt ) ( table-or-subquery ) ,
join-clause

window-defn:

( base-window-name PARTITION BY expr , ORDER BY ordering-term , frame-spec )

frame-spec:

ГРУППЫ МЕЖДУ НЕОГРАНИЧЕННЫМИ ПРЕДШЕСТВУЮЩИМИ И НЕОГРАНИЧЕННЫМИ СЛЕДУЮЩИМИ ДИАПАЗОН СТРОКИ НЕОГРАНИЧЕННЫМИ ПРЕДШЕСТВУЮЩИМИ expr ПРЕДШЕСТВУЮЩИМИ ТЕКУЩАЯ СТРОКА expr ПРЕДШЕСТВУЮЩИМИ ТЕКУЩАЯ СТРОКА expr СЛЕДУЮЩИМИ expr ПРЕДШЕСТВУЮЩИМИ ТЕКУЩАЯ СТРОКА expr СЛЕДУЮЩИМИ
Исключить Текущий Строка Исключить Группа Исключить Связи Исключить Нет Другие

Имя типа:

имя ( число со знаком , число со знаком ) ( число со знаком )

Число со знаком:

+ числовое значение -

Имя квалифицированной таблицы:

имя-схемы . имя-таблицы КАК псевдоним ИНДЕКСИРОВАННЫЙ ПО имя-индекса НЕ ИНДЕКСИРОВАННЫЙ

оператор возврата:

ВОЗВРАЩЕНИЕ выражение КАК псевдоним-колонки * ,

Команда 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-ограниченный:

С РЕКУРСИВНЫЙ common-table-expression , УДАЛИТЬ ИЗ qualified-table-name ГДЕ выражение запрос-с-возвращаемым-значением СОРТИРОВАТЬ ПО условие-сортировки , ОГРАНИЧИТЬ выражение СМЕЩАТЬ выражение , выражение

Если в операторе 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API