Основное отличие операторов TRUNCATE и DELETE в PostgreSQL при работе с большими наборами данных заключается в уровне работы с данными. dzen.ru www.cybertec-postgresql.com
DELETE удаляет строки по одной, каждая строка удаляется по отдельности, с возможностью использования условий (через WHERE). dzen.ru При удалении большого объёма данных это более медленная операция, так как строки удаляются поштучно и каждая операция фиксируется в журнале транзакций. dzen.ru
TRUNCATE, в свою очередь, удаляет все строки сразу, работает на уровне всей таблицы. dzen.ru Нельзя использовать условие WHERE. dzen.ru TRUNCATE быстрее, так как не удаляет строки по отдельности, а просто освобождает всю таблицу сразу. dzen.ru
Ещё несколько отличий:
- Логирование. dzen.ru TRUNCATE логирует только факты удаления страниц данных, а не всех строк по отдельности, что делает операцию быстрее. dzen.ru DELETE, в свою очередь, логирует операцию для каждой удалённой строки, что позволяет откатить транзакцию. dzen.ru
- Влияние на идентификаторы (AUTO_INCREMENT). dzen.ru TRUNCATE сбрасывает счётчик автоинкремента, начиная его заново с установленного значения (обычно с 1). dzen.ru DELETE при использовании автоинкрементных полей удаление строк не сбрасывает счётчик. dzen.ru
- Триггеры. dzen.ru TRUNCATE не активирует триггеры, связанные с удалением строк, так как строки не удаляются по одной. dzen.ru DELETE запускает триггеры, связанные с удалением строк. dzen.ru
- Операция транзакции. dzen.ru DELETE можно использовать в рамках транзакции, и при необходимости откатить (сделать rollback). dzen.ru TRUNCATE в большинстве СУБД также можно использовать в транзакции, но есть исключения в некоторых системах или версиях. dzen.ru
- Ограничения (Foreign Keys). dzen.ru DELETE возможно использовать даже в таблицах, которые ссылаются на другие таблицы через внешние ключи. dzen.ru TRUNCATE часто не позволяет удалять данные в таблицах, которые участвуют во внешних ключах (в зависимости от СУБД). dzen.ru