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

Ответ

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

Аспект DELETE TRUNCATE
Условие Может использовать WHERE для выборочного удаления. Удаляет все строки таблицы. Условие WHERE не поддерживается.
Журналирование Каждое удаление строки логируется (записывается в журнал транзакций). Это позволяет выполнить ROLLBACK. Обычно журналируется только освобождение страниц данных, что делает операцию невозвратной в большинстве СУБД (после коммита).
Триггеры Запускает триггеры DELETE. Не запускает триггеры.
Скорость Медленнее, особенно на больших таблицах, так как удаляет строки по одной. Значительно быстрее, так как освобождает данные на уровне страниц (деаллоцирует экстенты).
Автоинкремент (IDENTITY) Не сбрасывает счетчик. Сбрасывает счетчик автоинкремента до начального значения (обычно 1).

Примеры:

-- DELETE: Удалить конкретные записи. Операцию можно откатить.
DELETE FROM Orders WHERE order_date < '2023-01-01';

-- TRUNCATE: Мгновенно очистить всю таблицу. Практически необратимо.
TRUNCATE TABLE AuditLog;

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

Ответ 18+ 🔞

Давай разберем эту тему, чтобы всё встало на свои места, а то разница между ними — просто пиздец!

Представь, что у тебя есть стол, заваленный бумажками (это твоя таблица). Так вот, DELETE — это когда ты садишься и выкидываешь бумажки по одной, внимательно смотря на каждую. «Ага, эта за 2022 год — нахуй в корзину. Эта за 2023 — оставить». Медленно, зато с умом. А TRUNCATE — это когда ты, блядь, подходишь к этому столу, хватаешь его за край и со всей дури дёргаешь вверх. ВСЕ бумаги летят нахуй на пол одним махом. Быстро, жёстко и безвозвратно.

Теперь по пунктам, чтобы волнение ебать не возникало:

  1. УСЛОВИЯ (WHERE): С DELETE ты можешь быть хитрой жопой и указывать, что именно удалять. С TRUNCATE — никаких условий, чувак. Всё. Всё к ебеням. Ты просто говоришь таблице: «Привет, я тебя обнуляю». И она обнуляется.

  2. ЖУРНАЛИРОВАНИЕ И ОТКАТ: Вот тут главный подвох. DELETE — пай-мальчик. Он каждую удалённую строчку аккуратно записывает в журнал. Накосячил? ROLLBACK, и всё вернулось, как будто нихуя и не было. TRUNCATE же — это терпения ноль ебать. Он журналирует не строки, а факт «освободил вот эти страницы памяти». И после коммита откатить это — ёперный театр, практически нереально. Это как сжечь документы, а не порвать.

  3. ТРИГГЕРЫ: Если у тебя на таблице висят триггеры на удаление, то DELETE их честно запустит. TRUNCATE же на эти триггеры кладёт огромный, блядь, хуй с горы. Он их игнорирует напрочь. Учти это, а то будешь потом охуевать, почему логи не пишутся.

  4. СКОРОСТЬ: Ну тут и ежу понятно. Удалять по одной записи (DELETE без условия) на таблице в миллион строк — это ядрёна вошь, можно до завтра сидеть. TRUNCATE делает это почти мгновенно, потому что он не возится с каждой строкой, а просто помечает место под таблицу как «свободное». Разница — овердохуища.

  5. АВТОИНКРЕМЕНТ (IDENTITY / SERIAL): Вот смотри. У тебя в таблице Users id дошёл до 1000. Сделал DELETE FROM Users — все строки ушли, но счётчик запомнил, что последний id был 1000. Новая запись получит id 1001. А вот если сделаешь TRUNCATE TABLE Users — счётчик обнулится нахуй, к стартовому значению. Следующая запись будет с id 1. Сам от себя охуеешь, если не знал.

Короче, вывод простой, как палка:

  • DELETE — для хирургических операций. «Удали мне вот это и вот это, и я, может, передумаю».
  • TRUNCATE — для тотального зачиста, когда старые данные нахуй не сдались. «Очисти мне всё к чёртовой матери, и да побыстрее».

Примеры из жизни, чтобы вообще доверия ебать ноль не осталось:

-- DELETE: Чистим старые логи, но только за прошлый год. Всё цивильно, можно откатить.
DELETE FROM server_logs WHERE log_date < '2023-01-01';

-- TRUNCATE: В тестовой базе перед новым прогоном надо очистить таблицу. Старые тестовые данные нам нахуй не упёрлись.
TRUNCATE TABLE temp_test_data;

Запомни эту разницу, а то будешь потом как тот полупидор, который TRUNCATE на проде по ошибке запустил, а потом с круглыми глазами ищет, как откатить. Не будь таким.