В чём разница между операторами DELETE и TRUNCATE в SQL?

Ответ

DELETE и TRUNCATE удаляют строки из таблицы, но делают это принципиально разными способами.

Критерий DELETE TRUNCATE
Способ работы Удаляет строки по одной, записывая каждое удаление в журнал транзакций (для возможного отката). Деаллоцирует (освобождает) целые страницы данных, на которых хранилась таблица. Работает как операция DDL.
Где условие (WHERE) Можно указать условие для выборочного удаления. Нельзя. Всегда удаляет все строки в таблице.
Скорость Медленнее, особенно для больших таблиц, из-за логгирования и проверок. Значительно быстрее, так как минимизирует логгирование (записывает только освобождение страниц).
Триггеры Запускает триггеры ON DELETE. Не запускает триггеры.
Ограничения внешнего ключа Работает, если не нарушает FOREIGN KEY. Часто не работает, если на таблицу есть активные ссылки из других таблиц (зависит от СУБД).
Автоинкремент (IDENTITY/SEQUENCE) Не сбрасывает счётчик. Следующая вставка продолжит с последнего значения. Сбрасывает счётчик до начального значения (обычно 1).
Откат (ROLLBACK) Можно откатить в рамках транзакции (т.к. операции залогированы). В большинстве СУБД (PostgreSQL, SQL Server) также можно откатить.

Примеры:

-- DELETE: Удалить конкретные записи
DELETE FROM orders WHERE status = 'cancelled';
-- После этого INSERT в orders продолжит нумерацию id с последнего удаленного +1.

-- TRUNCATE: Полностью очистить временную таблицу
TRUNCATE TABLE temp_session_data;
-- Таблица пуста, и её автоинкрементный id сброшен на 1.

Резюме: Используйте DELETE для выборочного удаления строк с возможностью отката. Используйте TRUNCATE для быстрой полной очистки таблицы, когда триггеры и ссылочная целостность не являются препятствием.

Ответ 18+ 🔞

А, ну так вот, объясняю на пальцах, как эти две команды друг от друга отличаются. Представь, что у тебя есть комната, забитая хламом до самого потолка.

DELETE — это как если ты заходишь в эту комнату и начинаешь выкидывать вещи по одной. Каждую книжку, каждый старый свитер ты берёшь, несёшь к мусорке и записываешь в блокнотик: «Выкинул свитер синий, 14:05». Если передумаешь — по записям можешь всё назад притащить. Но процесс, ясное дело, долгий, особенно если хлама овердохуища. И главное — ты можешь выбирать: «Выкинуть только носки, а футболки оставить». Это и есть WHERE.

TRUNCATE — это ты подъезжаешь к этой комнате на погрузчике, ёпта, вышибаешь дверь и просто опустошаешь всё пространство целиком. Не разбирая, что там лежит — всё на свалку. Страницы памяти, где эта таблица жила, просто освобождаются. Записываешь ты в блокнот только одну строчку: «Освободил комнату №5». Быстро? Ебать как быстро! Но выборочно почистить не получится — всё летит в трубу. И счётчик автоинкремента (это который id новые нумерует) обнуляется, будто ничего и не было.

Вот тебе конкретика, чтобы в голове отложилось:

  • Хочешь удалить что-то конкретное? Например, всех юзеров по имени «Вася». DELETE FROM users WHERE name = 'Вася'; — и триггеры на удаление, если есть, отработают.
  • Надо снести всю тестовую таблицу к ебеням, чтобы начать заново? TRUNCATE TABLE test_data; — и через секунду она пуста, а автоинкремент сброшен. Волнение ебать — скорость просто космос. Но если на эту таблицу есть ссылки из других таблиц (внешние ключи), то может и не даст сделать, пидарас шерстяной.

Короче, итог: DELETE — хирургический, точный, но медленный скальпель. TRUNCATE — огнемёт для полной зачистки площади. Выбирай по ситуации, а то доверия ебать ноль к тому, кто TRUNCATE в продакшене бездумно швыряет.