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

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