Как удалить строки из таблицы SQL (DELETE)?
Нужно удалить из таблицы один конкретный заказ, а потом — все отменённые заказы старше года. Как правильно удалить строки в SQL? Чем DELETE отличается от TRUNCATE и DROP?
2 ответа
Удаление строк — команда DELETE с обязательным (по смыслу) WHERE:
DELETE FROM orders
WHERE id = 42;
Удалить по сложному условию:
DELETE FROM orders
WHERE status = 'cancelled'
AND created_at < '2025-06-01';
Как и с UPDATE, главная опасность — забыть WHERE:
DELETE FROM orders; -- удалит ВСЕ строки таблицы!
Поэтому правило то же: сначала SELECT * FROM orders WHERE ... — посмотреть, что именно удалится, потом менять SELECT на DELETE. И по возможности в транзакции с ROLLBACK на случай ошибки.
Разница с похожими командами:
- DELETE — удаляет строки по условию, можно откатить, срабатывают триггеры. Медленнее на огромных объёмах.
- TRUNCATE — мгновенно очищает всю таблицу целиком, без WHERE, обычно быстрее и сбрасывает счётчики, но это уже операция уровня структуры.
- DROP TABLE — удаляет саму таблицу вместе с данными и структурой; после неё таблицы нет вообще.
Ещё момент: если на строку ссылается внешний ключ из другой таблицы, DELETE может не выполниться (нарушение ссылочной целостности), пока не удалите или не обновите зависимые строки.
Часто вместо физического удаления делают мягкое удаление (soft delete): добавляют столбец is_deleted или deleted_at и вместо DELETE пишут UPDATE ... SET deleted_at = NOW(). Так данные не теряются безвозвратно, их можно восстановить и сохранить для истории. А в выборках просто добавляют WHERE deleted_at IS NULL. Для важных данных это безопаснее, чем настоящий DELETE.