Ответ
Оба оператора удаляют данные из таблицы, но делают это принципиально разными способами.
| Аспект | DELETE |
TRUNCATE TABLE |
|---|---|---|
| Синтаксис | DELETE FROM table_name [WHERE ...]; |
TRUNCATE TABLE table_name; |
| Условие WHERE | Поддерживается. Можно удалять конкретные строки. | Не поддерживается. Удаляет все строки всегда. |
| Скорость | Медленнее. Удаляет строки по одной, записывая каждое удаление в журнал транзакций. | Значительно быстрее. Освобождает данные, удаляя экстенты (блоки данных), минимальное логирование. |
| Журнал транзакций | Подробное логирование каждой строки. Позволяет откатить операцию (в рамках транзакции). | Логируется только освобождение страниц. В большинстве СУБД нельзя откатить (является DDL-операцией). |
| Триггеры | Вызываются для каждой удаляемой строки. | Не вызываются. |
| Счетчик идентификаторов (IDENTITY/AUTO_INCREMENT) | Не сбрасывается. Новые записи получат следующее значение. | Сбрасывается до начального значения. |
| Требуемые права | DELETE на таблицу. |
Обычно более высокие права (например, DROP). |
Когда использовать?
- Используйте
DELETE, когда нужно удалить часть строк или важна возможность отката. - Используйте
TRUNCATE TABLE, когда нужно быстро удалить все строки из большой таблицы и сбросить счетчик ID.
Ответ 18+ 🔞
Ну, слушай, давай разберем эту дилемму, как два способа вынести мусор из квартиры. Один — это аккуратно, пакетик за пакетиком, а второй — это выкинуть весь холодильник в окно вместе с дверцей.
Вот смотри, DELETE — это такой педантичный зануда. Он приходит и говорит: «Так, я сейчас буду удалять строчечки. Вот эту — записал в журнал, удалил. А вот эту — о, с условием WHERE — записал, удалил. А эту, блядь, не трогаю, условие не прошла». И так, сука, по одной. Триггеры на каждой строке срабатывают, как сигнализация. Если передумал — можно всё откатить, он же всё залогировал, молодец. Но если таблица на миллион строк, это пиздец как долго. Чай успеешь заварить, сгонять в магазин, вернуться — а он всё ещё там ковыряется.
А теперь смотри на TRUNCATE TABLE. Это не операция, это, блядь, теракт. Он подходит к таблице, такой: «Всё? Все тут? А теперь, сука, ВСЕ НАХУЙ!». И БАБАХ! Не важно, что там у тебя в условиях WHERE — он их в рот не взял, он удаляет ВСЁ. Всё, что влезло. Вместо того чтобы строки перебирать, он просто берёт и освобождает целые блоки данных (эти, как их, экстенты), одним махом. Журналу транзакций пишет только: «Так, бля, страницы 1-1000 — свободны. Всё». И всё. Быстро, решительно, бесповоротно.
И вот тут, ёпта, главные подводные ебучки:
- Триггеры? Какие, нахуй, триггеры?
TRUNCATEих даже не заметит. Он не удаляет строки, он уничтожает само место, где они жили. Триггеры плачут в углу. - Откатить? Ха! В большинстве баз данных — нихуя. Это как спиздить у вора кошелёк — не вернёшь. Операция DDL, она часто сама себе коммитит.
- Счётчик автоинкремента (этот, IDENTITY)?
DELETEоставит как есть. Удалил ты записи до 1000, следующая будет 1001. АTRUNCATEвозьмёт и обнулит этот счётчик до начального значения. Всё, с чистого листа, будто ничего и не было. Хуй с горы. - Права? На
DELETE— да пожалуйста, обычные права. А чтобыTRUNCATEюзать, тебе часто праваDROPна таблицу нужны. То есть почти что право её вообще удалить. Не каждый проходимец может такую мощь в руки взять.
Короче, вывод, чтобы не ебать мозг:
- Юзай
DELETE, когда тебе нужно выборочно почистить (WHERE condition = 'shit') или если есть тень сомнения и может понадобиться откат. Или если у тебя там триггеры важные, которые должны отработать. - Врубай
TRUNCATE TABLEна полную, когда тебе нужно быстро и нахуй выкосить ВСЁ из большой таблицы и начать жизнь с чистого, ёбаного, листа. Скорость — овердохуищная, но последствия — окончательные.
Выбирай с умом, а то потом будешь, как Герасим, на берегу озера стоять и думать: «Что же я, мудак, сделал?».