TRUNCATE TABLE
Синтаксис
TRUNCATE [TABLE] tbl_name [WAIT n | NOWAIT]
Описание
TRUNCATE TABLE полностью очищает таблицу. Требуется привилегия DROP. См. GRANT.
tbl_name также может быть указано в виде db_name.tbl_name (см. Квалификаторы идентификаторов).
Логически, TRUNCATE TABLE эквивалентно оператору DELETE, удаляющему все строки, но в некоторых обстоятельствах существуют практические различия.
TRUNCATE TABLE завершится ошибкой для InnoDB таблицы, если какие-либо ограничения внешнего ключа из других таблиц ссылаются на эту таблицу, возвращая ошибку:
ERROR 1701 (42000): Cannot truncate a table referenced in a foreign key constraint
Ограничения внешнего ключа между столбцами в одной таблице разрешены.
Для InnoDB таблицы, если нет FOREIGN KEY ограничений, InnoDB выполняет быстрое усечение, удаляя исходную таблицу и создавая пустую таблицу с тем же определением, что намного быстрее, чем удаление строк по одной. Счётчик AUTO_INCREMENT сбрасывается операцией TRUNCATE TABLE, независимо от наличия FOREIGN KEY ограничения.
Количество строк, затронутых операцией TRUNCATE TABLE, точно отображается только при сопоставлении с оператором DELETE.
Для других типов хранилищ TRUNCATE TABLE отличается от DELETE следующим образом:
- Операции усечения удаляют и повторно создают таблицу, что намного быстрее, чем удаление строк по одной, особенно для больших таблиц.
- Операции усечения вызывают неявную фиксацию.
- Операции усечения не могут быть выполнены, если сессия удерживает активную блокировку таблицы.
- Операции усечения не возвращают осмысленное значение количества удалённых строк. Обычно результат — «0 строк затронуто», что следует интерпретировать как «нет информации».
- Пока файл формата таблицы
tbl_name.frmвалиден, таблицу можно пересоздать как пустую таблицу сTRUNCATE TABLE, даже если данные или индексные файлы повреждены. - Обработчик таблицы не запоминает последнее использованное значение AUTO_INCREMENT, а начинает отсчёт с начала. Это верно даже для MyISAM и InnoDB, которые обычно не повторно используют значения последовательности.
- При использовании с разнесёнными таблицами
TRUNCATE TABLEсохраняет разбиение, то есть данные и индексные файлы удаляются и повторно создаются, а файл определений разделов (.par) остается без изменений. - Так как усечение таблицы не использует
DELETE, операторTRUNCATEне вызывает триггеровON DELETE. -
TRUNCATE TABLEпросто обнуляет значения в таблицах сводки Performance Schema до нуля или NULL, не удаляя строк.
Для целей двоичного протоколирования и репликации, TRUNCATE TABLE обрабатывается как DROP TABLE, после чего CREATE TABLE (DDL вместо DML).
TRUNCATE TABLE не работает со представлениями. В настоящее время TRUNCATE TABLE удаляет все исторические записи из системной таблицы с версиями.
WAIT/NOWAIT
Устанавливает тайм-аут ожидания блокировки. См. WAIT и NOWAIT.
Режим Oracle
Режим Oracle начиная с MariaDB 10.3 позволяет использовать необязательные ключевые слова REUSE STORAGE или DROP STORAGE.
TRUNCATE [TABLE] tbl_name [{DROP | REUSE} STORAGE] [WAIT n | NOWAIT]
Эти ключевые слова не оказывают влияния на операцию.
Производительность
TRUNCATE TABLE быстрее, чем DELETE, так как она удаляет и пересоздаёт таблицу.
С InnoDB, TRUNCATE TABLE медленнее, если innodb_file_per_table=ON установлено (по умолчанию). Это связано с тем, что TRUNCATE TABLE разрывает связь с файлом пространства имен, что может быть дорогостоящей операцией. См. MDEV-8069 для получения дополнительной информации.
Проблемы производительности с innodb_file_per_table=ON могут усугубляться в случаях, когда кэширование InnoDB буфера очень велико, и innodb_adaptive_hash_index=ON установлено. В этом случае использование DROP TABLE, после которого следует CREATE TABLE, вместо TRUNCATE TABLE может иметь лучшие показатели производительности. Установка innodb_adaptive_hash_index=OFF (по умолчанию ON до MariaDB 10.5) также может помочь. Только в MariaDB 10.2, начиная с MariaDB 10.2.19, эту производительность также можно улучшить, установив innodb_safe_truncate=OFF. См. MDEV-9459 для получения дополнительной информации.
Установка innodb_adaptive_hash_index=OFF также может улучшить производительность TRUNCATE TABLE в целом. См. MDEV-16796 для получения дополнительной информации.
См. также
- Функция TRUNCATE
- innodb_safe_truncate системная переменная
- Режим Oracle с MariaDB 10.3
© 2023 MariaDB
Licensed under the Creative Commons Attribution 3.0 Unported License and the GNU Free Documentation License.
https://mariadb.com/kb/en/truncate-table/