Баннер мобильный (3) Пройти тест

Оператор DELETE SQL: как удалить данные из таблицы

И не нарушить работу всей системы

Uncategorized

5 февраля 2026

Поделиться

Скопировано
Оператор DELETE SQL: как удалить данные из таблицы

Содержание

    Нужно очистить таблицу от старых заказов? Удалить тестовых пользователей? Или убрать старые данные перед новым релизом? Все это делается с помощью одного оператора — DELETE.

    Он позволяет точечно удалять строки из таблицы, сохраняя ее структуру. Но стоит ошибиться — и можно потерять все данные. В этой статье разберем, как правильно пользоваться DELETE в SQL.

    Что такое DELETE в SQL?

    DELETE — это DML-оператор, который удаляет строки из существующей таблицы. Он не трогает структуру: индексы, ограничения, столбцы остаются на месте.

    Без условия WHERE команда DELETE FROM table_name удалит все строки. Это не ошибка — это синтаксис выполнения команды. И частая причина паники у новичков.

    Базовый синтаксис: как написать DELETE SQL

    Стандартный синтаксис прост:

    DELETE FROM имя_таблицы WHERE условие;
    • FROM имя_таблицы — обязательно.
    • WHERE условие — не обязательно, но практически всегда нужно.

    Пример:

    DELETE FROM orders WHERE status = 'cancelled';

    Этот запрос работает одинаково в PostgreSQL, MySQL и MS SQL Server.

    Как удалить строку из таблицы SQL: три базовых сценария

    Удаление по первичному ключу

    DELETE FROM users WHERE id = 101;

    Самый безопасный способ — когда вы точно знаете, что удаляете.

    Удаление по условию

    DELETE FROM sessions WHERE created_at < '2025-01-01';

    Удаление NULL-значений

    DELETE FROM customers WHERE email IS NULL;

    Лайфхак: перед DELETE всегда запустите SELECT с тем же условием.

    SELECT * FROM таблица WHERE условие;

    Так вы увидите, что именно попадет под нож.

    DELETE с подзапросом: как удалить данные на основе другой таблицы

    Иногда нужно удалить записи из таблицы SQL, опираясь на данные из связанной таблицы. Для этого используют подзапросы.

    Через IN

    DELETE FROM orders WHERE customer_id IN (  SELECT id FROM customers WHERE status = 'banned' );

    Через EXISTS

    DELETE FROM logs WHERE EXISTS (  SELECT 1 FROM sessions  WHERE sessions.id = logs.session_id AND sessions.expired = true );

    В MySQL нельзя напрямую ссылаться на ту же таблицу в подзапросе (Error 1093). Обход: заверните подзапрос в еще один SELECT.

    DELETE через JOIN: синтаксис в PostgreSQL, MySQL и MS SQL

    Здесь начинаются различия между СУБД.

    PostgreSQL / SQLite:

    DELETE FROM orders USING customers WHERE orders.customer_id = customers.id  AND customers.is_deleted = true;

    MySQL:

    DELETE orders FROM orders JOIN customers ON orders.customer_id = customers.id WHERE customers.status = 'some_status';

    MS SQL Server:

    DELETE o FROM orders o JOIN customers c ON o.customer_id = c.id WHERE c.status = 'some_status';

    Запомните: универсального синтаксиса нет. Всегда проверяйте документацию вашей СУБД.

    DELETE vs TRUNCATE: в чем разница?

    Критерий
    DELETE
    TRUNCATE TABLE
    Журналирование
    По строкам
    (можно откатить)
    По страницам
    (быстрее)
    Триггеры
    Срабатывают
    Не срабатывают
    FOREIGN KEY
    Разрешено
    (если нет ссылок)
    Запрещено
    в большинстве СУБД
    AUTO_INCREMENT / IDENTITY
    Сохраняется
    Сбрасывается
    (в MySQL, SQL Server)
    Условие (WHERE)
    Поддерживается
    Нет

    Пример:

    -- Удалить все логи, но сохранить автоинкремент DELETE FROM logs;
    -- Полностью очистить таблицу и сбросить счетчик TRUNCATE TABLE logs;

    В PostgreSQL можно управлять поведением счетчика через RESTART IDENTITY или CONTINUE IDENTITY.

    Как не угробить продакшен: пять правил безопасности

    1. Проверяйте через SELECT — всегда.
    2. Используйте транзакции:
    BEGIN; DELETE FROM orders WHERE ...; ROLLBACK; -- или COMMIT;
    1. Архивируйте перед удалением:
    INSERT INTO orders_archive SELECT * FROM orders WHERE ...; DELETE FROM orders WHERE ...;
    1. Ограничьте объем (особенно в больших таблицах):
    DELETE FROM logs ORDER BY created_at LIMIT 10000; -- MySQL DELETE TOP (10000) FROM logs WHERE ...; -- SQL Server
    1. Никогда не запускайте DELETE без WHERE в боевой среде.

    Распространенные ошибки

    •  «Cannot specify target table for update in FROM clause» — MySQL не любит, когда вы ссылаетесь на ту же таблицу в подзапросе.
    •  WHERE user_id = ‘null’ вместо IS NULL — удаляете не то, что хотели.
    •  Игнорирование внешних ключей — ошибка целостности.
    • Попытка использовать LIMIT в PostgreSQL — там это работает только через CTE.

    Практические сценарии: где применяют DELETE

    • E-commerce: удаление корзин, не обновляющихся 30+ дней.
    • CRM: очистка дубликатов контактов.
    • Логистика: удаление завершенных рейсов.
    • Аналитика: удаление тестовых данных после A/B-теста.

    Пример:

    DELETE FROM cart_items WHERE cart_id IN (  SELECT id FROM carts  WHERE updated_at < NOW() - INTERVAL '30 days' );

    Коротко о DELETE

    Оператор DELETE в SQL — мощный инструмент для управления данными. Он позволяет удалить строку из таблицы SQL или тысячи записей с хирургической точностью.

    Главное — не торопиться. Проверяйте условия, используйте транзакции, архивируйте данные. Тогда даже массовое удаление пройдет без потерь.

    Uncategorized

    Поделиться

    Скопировано
    0 комментариев
    Комментарии