JavaRush /Курсы /SQL SELF /Удаление данных с использованием DELETE

Удаление данных с использованием DELETE

SQL SELF
21 уровень , 3 лекция
Открыта

Удаление — это не просто функция, это искусство! Важно удалить ровно то, что нужно, и не зацепить ничего лишнего (случайно удалённые данные могут надолго преследовать вас в ночных кошмарах). Сегодня мы научимся делать это аккуратно и по всем правилам!

Удаление данных — это процесс исключения одной или нескольких строк из таблицы, которые больше не соответствуют бизнес-логике или требованиям вашей системы. Например, вам нужно удалить записи о студентах, которые закончили учёбу или значительно, хм, нарушили правила университета. Или, скажем, вам необходимо почистить данные в таблице, чтобы оставить только актуальную информацию.

Операция удаления данных используется в следующих сценариях:

  • Удаление данных о пользователях, которые больше не активны.
  • Очистка таблиц от временных записей.
  • Удаление дубликатов данных.
  • Удаление устаревших записей в соответствии с определённой бизнес-логикой.

Синтаксис команды DELETE

Для удаления данных мы используем команду DELETE. Вот её базовый синтаксис:

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

Основные составляющие:

  • DELETE FROM — ключевая фраза, используемая для указания, что нужно удалить строки из таблицы.
  • таблица — имя таблицы, из которой необходимо удалить данные.
  • WHERE условие — условие фильтрации строк, которые требуется удалить. Тут вы можете использовать любые операторы сравнения, логические операторы (AND, OR, NOT) и даже подзапросы.

Пример: представьте, что у нас есть таблица students, и мы хотим удалить из неё студента с ID = 5:

DELETE FROM students
WHERE id = 5;

Этот запрос удалит строку из таблицы students, где идентификатор студента (столбец id) равен 5.

Важно: если вы забудете указать условие WHERE, PostgreSQL удалит все строки из таблицы. Подобная ошибка может стать катастрофической, особенно если речь идёт о продакшн-системе.

Удаление всех строк из таблицы

Если вам нужно удалить все строки из таблицы, можете явно указать запрос без условия WHERE. Например:

DELETE FROM students;

Этот запрос удалит все записи из таблицы students. Однако структура таблицы останется на месте — она не будет удалена, просто станет пустой.

Альтернатива: TRUNCATE

Для удаления всех строк из таблицы можно использовать и команду TRUNCATE. Она работает быстрее, чем DELETE, так как не фиксирует удаление каждой строки в журнале транзакций. Пример:

TRUNCATE TABLE students;

Отличия DELETE от TRUNCATE:

  • DELETE записывает каждое удаление в журнал транзакций, что позволяет откатить их при необходимости.
  • TRUNCATE не поддерживает условия (WHERE) и не фиксирует удаление поштучно, что делает его быстрее, но менее гибким.

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

Удаление данных по сложным условиям

Условия удаления в DELETE могут быть не только простыми, но и сложными, включающими логические операторы (AND, OR, NOT) или даже подзапросы. Давайте посмотрим пример.

Пример 1: Удаление нескольких записей Удалим всех студентов, чей возраст больше 30 лет и которые не посещали занятия последние 3 месяца:

DELETE FROM students
WHERE age > 30 AND last_attendance_date < (CURRENT_DATE - INTERVAL '3 months');

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

Пример 2: Удаление с использованием подзапроса

Допустим, у нас есть таблица failed_students, где хранятся идентификаторы студентов, исключённых за академическую неуспеваемость. Нам нужно удалить их из основной таблицы students:

DELETE FROM students
WHERE id IN (SELECT student_id FROM failed_students);

Здесь подзапрос возвращает все идентификаторы студентов из таблицы failed_students, и команда DELETE удаляет соответствующие строки из таблицы students.

Рекомендация

Прежде чем что-то удалять напишите SELECT, который отобразит данные, которые вы хотите удалить. А потом просто замените часть SELECT на DELETE, и он удалит те же строчки, что только что отображал.

Пример практического применения

Представим, что студент с ID = 7 решил сменить университет. Удалим все данные о нём из нашей таблицы:

DELETE FROM students
WHERE id = 7;

Проверьте таблицу после выполнения команды, чтобы убедиться, что запись действительно удалена:

SELECT * FROM students WHERE id = 7;

Если записей с ID = 7 больше нет, операция удаления успешно выполнена.

Предупреждения и типичные ошибки

Забытая секция WHERE

Одной из самых распространённых ошибок при работе с DELETE является упущение секции WHERE. Это приводит к удалению всех строк из таблицы, что может стать настоящей катастрофой. Всегда проверяйте свои запросы перед их выполнением.

Пример ситуации, вызванной забывчивостью:

DELETE FROM students;
-- Ошибка! Удаление всех студентов.

Чтобы избежать подобных ошибок, рекомендуется перед выполнением команды DELETE всегда тестировать условие WHERE с помощью команды SELECT. Например:

SELECT * FROM students WHERE id = 5;

Если вывод вас устраивает, то можно смело запускать DELETE.

Удаление связанных данных

Если таблица содержит внешние ключи (FOREIGN KEY), при удалении данных может возникнуть ошибка. Это происходит, если удаляемая строка связана с другими записями. Например, если студент записан на курс в таблице enrollments, PostgreSQL не позволит вам удалить его из таблицы students.

Чтобы решить эту проблему, можно:

  1. Использовать каскадное удаление ON DELETE CASCADE при создании внешнего ключа.
  2. Удалить связанные записи вручную перед удалением записи из основной таблицы.

Пример ручного удаления связанных данных:

-- сначала удаляем данные о студенте 5 из таблицы enrollments
DELETE FROM enrollments
WHERE student_id = 5;

-- затем удаляем самого студента 5
DELETE FROM students
WHERE id = 5;

Удаление с транзакциями

Для критически важных операций удаления рекомендуется использовать транзакции. Это позволит вам откатить изменения в случае ошибки.

Пример удаления в транзакции:

BEGIN;

DELETE FROM students
WHERE id = 42;

-- Проверяем результат
SELECT * FROM students WHERE id = 42;

-- Если всё хорошо, фиксируем изменения
COMMIT;

-- Если нет, откатываем
-- ROLLBACK;

Подробнее о транзакциях в следующих лекциях :P

2
Задача
SQL SELF, 21 уровень, 3 лекция
Недоступна
Удаление товаров с низким запасом
Удаление товаров с низким запасом
Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ