Короткий ответ
DELETE удаляет строки по условию и может быть отменён в транзакции, TRUNCATE мгновенно очищает всю таблицу без построчной обработки (и в PostgreSQL тоже транзакционен), а DROP полностью удаляет объект таблицы вместе со схемой.
Как это работает подробнее
DELETE построчно проверяет условие WHERE и может вызывать триггеры ON DELETE. TRUNCATE не сканирует строки, быстро освобождает страницы таблицы и по умолчанию сбрасывает SERIAL/IDENTITY, если не указано CONTINUE IDENTITY. DROP удаляет саму структуру таблицы, включая индексы и ограничения.
Пример кода
example.sql
BEGIN;
TRUNCATE TABLE sessions RESTART IDENTITY;
-- В PostgreSQL TRUNCATE тоже транзакционен, можно сделать ROLLBACK
ROLLBACK; -- таблица sessions останется нетронутойЧто использовать на практике
- Практика. DELETE используют, когда нужно удалить часть данных по условию или нужны триггеры; TRUNCATE — для быстрой очистки всей таблицы в тестах/ETL; DROP — при удалении таблицы из схемы, например при откате миграции.
Подводные камни
- Ошибка. Используют DELETE FROM table; без WHERE для очистки большой таблицы — это медленнее TRUNCATE и сильнее нагружает WAL и автовакуум; забывают, что TRUNCATE требует ACCESS EXCLUSIVE lock и блокирует параллельные чтения.