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

Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ