Spec-Zone.ru › MariaDB

УДАЛЕНИЕ

Синтаксис

Синтаксис для одной таблицы:

DELETE [LOW_PRIORITY] [QUICK] [IGNORE] 
  FROM tbl_name [PARTITION (partition_list)]
  [FOR PORTION OF period FROM expr1 TO expr2]
  [WHERE where_condition]
  [ORDER BY ...]
  [LIMIT row_count]
  [RETURNING select_expr 
    [, select_expr ...]]

Синтаксис для нескольких таблиц:

DELETE [LOW_PRIORITY] [QUICK] [IGNORE]
    tbl_name[.*] [, tbl_name[.*]] ...
    FROM table_references
    [WHERE where_condition]

Или:

DELETE [LOW_PRIORITY] [QUICK] [IGNORE]
    FROM tbl_name[.*] [, tbl_name[.*]] ...
    USING table_references
    [WHERE where_condition]

Обрезка истории:

DELETE HISTORY
  FROM tbl_name [PARTITION (partition_list)]
  [BEFORE SYSTEM_TIME [TIMESTAMP|TRANSACTION] expression]

Описание

Параметр Описание
LOW_PRIORITY Ожидать, пока все запросы SELECT завершатся, прежде чем начинать оператор. Используется с движками хранилища, которые используют блокировку таблиц (MyISAM, Aria и т.д.). Подробности см. в разделе HIGH_PRIORITY и LOW_PRIORITY клаузы.
QUICK Указывает движку хранилища, что ожидается удаление большого количества строк. Движок хранилища может выполнять действия для ускорения удаления, такие как игнорирование слияния блоков данных до тех пор, пока все строки не будут удалены из блока (вместо того, чтобы ожидать, пока блок не заполнится наполовину). Это ускоряет процесс за счет потери пространства в блоках данных. Данная функция поддерживается, по крайней мере, в движках MyISAM и Aria.
IGNORE Не останавливать запрос, даже если произойдет некритическая ошибка (например, переполнение данных). Полное описание см. в разделе Как работает IGNORE.

Для синтаксиса одной таблицы оператор DELETE удаляет строки из tbl_name и возвращает количество удаленных строк. Это значение можно получить, вызвав функцию ROW_COUNT(). Клауза WHERE, если задана, определяет условия, по которым идентифицируются строки для удаления. Без клаузы WHERE, удаляются все строки. Если задана клауза ORDER BY, строки удаляются в указанном порядке. Клауза LIMIT устанавливает ограничение на количество удаляемых строк.

Для синтаксиса нескольких таблиц, DELETE удаляет из каждой tbl_name строки, удовлетворяющие условиям. В этом случае, ORDER BY и LIMIT нельзя использовать. DELETE также может ссылаться на таблицы, расположенные в разных базах данных; см. Квалификаторы идентификаторов для синтаксиса.

where_condition — это выражение, которое вычисляется как истинное для каждой строки, подлежащей удалению. Оно задается так, как описано в SELECT.

В настоящее время невозможно удалить данные из таблицы и выбрать данные из той же таблицы в подзапросе.

Для удаления строк из таблицы необходимо иметь привилегию DELETE на эту таблицу. Для столбцов, используемых только для чтения, таких как те, что указаны в WHERE клаузе, требуется только привилегия SELECT. См. GRANT.

Как указано выше, оператор DELETE без клаузы WHERE удаляет все строки. Более быстрый способ сделать это, когда вам не нужно знать количество удаленных строк, — использовать TRUNCATE TABLE. Однако, внутри транзакции или если у вас есть блокировка таблицы, TRUNCATE TABLE нельзя использовать, в то время как DELETE можно. См. TRUNCATE TABLE и LOCK.

РАЗДЕЛЁННЫЕ ТАБЛИЦЫ

Подробнее см. в разделе Оптимизация запросов на разделенных таблицах.

ДЛЯ ЧАСТИ

MariaDB начиная с 10.4.3

См. Применение временных интервалов — удаление по частям.

ВОЗВРАЩЕНИЕ

Возвращение набора результатов удаленных строк для одной таблицы клиенту возможно с использованием синтаксиса DELETE ... RETURNING select_expr [, select_expr2 ...]]

Разрешены любые выражения SQL, которые могут быть вычислены из полей одной строки. Разрешены подзапросы. Разрешено использование ключевого слова AS, что позволяет использовать псевдонимы.

Использование агрегатных функций не допускается. ВОЗВРАЩЕНИЕ нельзя использовать в операциях DELETE для нескольких таблиц.

MariaDB начиная с 10.3.1

Та же таблица-источник и таблица-цель

До MariaDB 10.3.1 удаление из таблицы с той же таблицей-источником и таблицей-целью было невозможно. Начиная с MariaDB 10.3.1, это теперь возможно. Например:

DELETE FROM t1 WHERE c1 IN (SELECT b.c1 FROM t1 b WHERE b.c2=0);
MariaDB начиная с 10.3.4

ИСТОРИЯ УДАЛЕНИЙ

Можно использовать DELETE HISTORY для удаления исторической информации из таблиц с исторической информацией.

Примеры

Как использовать клаузы ORDER BY и LIMIT:

DELETE FROM page_hit ORDER BY timestamp LIMIT 1000000;

Как использовать клаузу RETURNING:

DELETE FROM t RETURNING f1;
+------+
| f1   |
+------+
|    5 |
|   50 |
|  500 |
+------+ 

Следующий оператор объединяет две таблицы: одна используется только для удовлетворения условия WHERE, но из неё не удаляются строки; вместо этого удаляются строки из другой таблицы.

DELETE post FROM blog INNER JOIN post WHERE blog.id = post.blog_id;

Удаление из той же таблицы-источника и таблицы-цели

CREATE TABLE t1 (c1 INT, c2 INT);
DELETE FROM t1 WHERE c1 IN (SELECT b.c1 FROM t1 b WHERE b.c2=0);

До MariaDB 10.3.1, это возвращало:

ERROR 1093 (HY000): Table 't1' is specified twice, both as a target for 'DELETE' 
  and as a separate source for

Начиная с MariaDB 10.3.1:

Query OK, 0 rows affected (0.00 sec)

См. также

  • Как работает IGNORE
  • SELECT
  • ORDER BY
  • LIMIT
  • REPLACE ... ВОЗВРАЩЕНИЕ
  • INSERT ... ВОЗВРАЩЕНИЕ
  • Клауза возвращения (видео)
Содержимое, воспроизводимое на этом сайте, является собственностью соответствующих владельцев, и это содержимое не проходит предварительную проверку со стороны MariaDB. Мнения, информация и мнения, выраженные в данном контенте, не обязательно отражают точку зрения MariaDB или любой другой стороны.

© 2023 MariaDB
Licensed under the Creative Commons Attribution 3.0 Unported License and the GNU Free Documentation License.
https://mariadb.com/kb/en/delete/

Spec-Zone.ru

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