Какие способы очистки таблицы существуют кроме delete в SQL
Что проверяют
Знаете ли вы разницу между DELETE, TRUNCATE и DROP не на уровне «быстрее и медленнее», а по последствиям: откат, триггеры, счётчики, внешние ключи. Тестировщику следом почти всегда задают вопрос, как он готовит и чистит данные между тестами.
Как отвечать
TRUNCATE: удаляет все строки разом, освобождая страницы данных, а не помечая каждую строку. БезWHERE, построчные триггеры не срабатывают. Откатывается ли он, зависит от СУБД: в PostgreSQL и SQL Server внутри транзакции да, в MySQL и Oracle это DDL с неявным коммитом;- счётчики: в SQL Server и MySQL
TRUNCATEсбрасывает автоинкремент, в PostgreSQL для этого нуженTRUNCATE ... RESTART IDENTITY, по умолчанию последовательность продолжается; - внешние ключи: SQL Server не даст очистить таблицу, на которую ссылаются, даже если дочерние таблицы пустые. В PostgreSQL есть
CASCADE, он очистит и все ссылающиеся таблицы; DROP TABLE: удаляет саму таблицу вместе с индексами и правами, дальше схему нужно пересоздать. Удобно, когда тестовая база и так поднимается миграциями;- секции: для логов и больших таблиц удаление или отсоединение секции (
DROP PARTITION,DETACH PARTITION, синтаксис зависит от СУБД) вместо удаления миллионов строк; - подмена таблицы: создать пустую копию той же структуры, переименовать, старую удалить позже.
Для тестов лучше вообще не чистить руками: каждый тест идёт в транзакции и откатывается, либо база поднимается заново из шаблона или в Testcontainers. DELETE оставьте для выборочной очистки своих данных по WHERE, а большие объёмы удаляйте пачками, чтобы не держать долгие блокировки.
Где спотыкаются
Утверждают, что TRUNCATE никогда не откатывается. В PostgreSQL это обычная транзакционная команда, и такой ответ на собеседовании по конкретной базе выдаёт заученную шпаргалку.
Забывают про сброс идентификаторов. Тест, который рассчитывает на id = 1 после очистки, проходит в MySQL и падает в PostgreSQL без RESTART IDENTITY.
Запускают TRUNCATE ... CASCADE или очистку целой таблицы на общем стенде. Каскад молча зачищает соседние таблицы, и данные коллег пропадают вместе с вашими.