DELETE
удаление записи/строки из таблицы MySQL.MySQL-инструкция DELETE
удаляет строки из таблицы и возвращает количество удаленных строк. Чтобы проверить количество удаленных строк, необходимо вызвать функцию SELECT ROW_COUNT()
. Аналогичная функция Python модуля MySQLdb
- Cursor.rowcount
.
DELETE
.-- удаление строк/записей из одной таблицы DELETE [IGNORE] FROM tbl_name [AS tbl_alias] WHERE condition ORDER BY ... [ASC|DESC] LIMIT count
DELETE
:Условия в необязательном операторе WHERE
определяют, какие строки следует удалить. ВНИМАНИЕ! При отсутствии предложения WHERE
будут удалены ВСЕ строки. Условие condition
- это выражение, которое принимает значение TRUE
для каждой удаляемой строки. Дополнительно смотрите материал "Использование инструкции WHERE в запросах к БД MySQL"
Если указана инструкция ORDER BY
, то строки удаляются в указанном порядке. ORDER BY
можно применить к удалениям из одной таблицы, но не поддерживает удаления из нескольких таблиц.
Инструкция LIMIT
устанавливает ограничение на количество строк, которые могут быть удалены. LIMIT
можно применить к удалениям из одной таблицы, но не к удалениям из нескольких таблиц.
Модификатор IGNORE
заставляет MySQL игнорировать ошибки во время процесса удаления строк. (Ошибки, возникшие на этапе синтаксического анализа, обрабатываются обычным способом.) Ошибки, которые игнорируются из-за использования IGNORE
, возвращаются как предупреждения.
Инструкция TRUNCATE TABLE
является более быстрым способом очистки таблицы, чем оператор DELETE
без предложения WHERE
. В отличие от DELETE
, инструкцию TRUNCATE TABLE
нельзя использовать внутри транзакции и при блокировке таблицы.
WHERE
при удалении записей.Условия WHERE
определяет, какие строки следует удалить, а при его отсутствии будут удалены ВСЕ строки. Условие condition
- это выражение, которое принимает значение TRUE
для каждой удаляемой строки.
Например стоит задача: удаления записей о продажах за определенное число или очистка старых (ненужных) данных из таблицы sales
:
-- удаление старых (ненужных) записей о продажах до '2001-07-09' DELETE FROM sales WHERE date_sales < '2001-07-09'; -- удаления записей о продажах за сегодня DELETE FROM sales WHERE date_sales=NOW();
Дополнительно смотрите материал "Использование инструкции WHERE в запросах к БД MySQL"
ORDER BY
и LIMIT
.Инструкции ORDER BY
и LIMIT
можно использовать, если при удалении данных необходимо оставить какое то определенное количество строк новых записей.
-- подсчитываем кол-во строк в таблице `logs` SET @count = SELECT count(id) FROM logs; -- удаляем все, кроме 500 последних добавленных строк DELETE FROM logs WHERE @count > 500 ORDER BY id ASC LIMIT @count - 500;
Или, наверное, можно так (не проверяли):
-- оставит последние 500 строк, если журнал -- таблицы `logs` не превышает 10000000 записей DELETE FROM logs ORDER BY id DESC LIMIT 500, 10000000;
Более подробно об использование инструкций ORDER BY
и LIMIT
смотрите в материале "Составление запросов SELECT к БД MySQL"
Удаление информации - вещь ответственная. Неправильно поставленный запрос может обернуться потерей критических данных. Рекомендуем редко пользоваться запросами DELETE
из нескольких таблиц. Если такой запрос необходим в целях оптимизации производительности, сначала постройте подобный запрос с использованием инструкции SELECT
, а потом просто замените SELECT
на DELETE
, а также уберите из запроса извлекаемые столбцы.
-- проверочный запрос `SELECT` SELECT tbl_a.col, tbl_b.col FROM tbl_a , tbl_b USING tbl_a.id = tbl_b.id WHERE condition -- если проверочный запрос выдал -- те строки, которые необходимо удалить, -- то переделываем его на `DELETE` DELETE FROM tbl_a , tbl_b USING tbl_a.id = tbl_b.id WHERE condition
TRUNCATE TABLE
полная очистка таблицы MySQL.Пример очистки таблицы animals
от всех записей:
TRUNCATE TABLE animals
Хотя TRUNCATE TABLE
похож на инструкцию DELETE
, он отличается следующим:
TRUNCATE
удаляют и заново создают таблицу, что намного быстрее, чем удаление строк по одной, особенно для больших таблиц.TRUNCATE
вызывают неявную фиксацию, поэтому их нельзя откатить. TRUNCATE
не могут быть выполнены, если сеанс удерживает активную блокировку таблицы.TRUNCATE TABLE
терпит неудачу для таблицы InnoDB, если есть какие-либо ограничения FOREIGN KEY
из других таблиц, которые ссылаются на таблицу. Допускаются ограничения внешнего ключа между столбцами одной и той же таблицы.TRUNCATE
не возвращают значимого значения количества удаленных строк. Обычный результат - "0 rows affected", что следует интерпретировать как "нет информации".AUTO_INCREMENT
сбрасывается до своего начального значения. Это верно даже для MyISAM и InnoDB, которые обычно не используют повторно значения последовательности.TRUNCATE TABLE
не вызывает триггеры ON DELETE
, установленные для внешнего ключа FOREIGN KEY
.