Видалення — це не просто функція, це мистецтво! Важливо видалити саме те, що треба, і не зачепити нічого зайвого (випадково видалені дані можуть ще довго снитися в нічних кошмарах). Сьогодні навчимося робити це акуратно і по фану!
Видалення даних — це процес виключення одного або кількох рядків з таблиці, які вже не відповідають бізнес-логіці або вимогам твоєї системи. Наприклад, треба видалити записи про студентів, які закінчили навчання або серйозно, хм, порушили правила універу. Або, скажімо, потрібно почистити дані в таблиці, щоб залишити тільки актуальну інфу.
Операція видалення даних використовується в таких сценаріях:
- Видалення даних про користувачів, які вже не активні.
- Очищення таблиць від тимчасових записів.
- Видалення дублікатів даних.
- Видалення застарілих записів згідно з певною бізнес-логікою.
Синтаксис команди 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.
Щоб вирішити цю проблему, можна:
- Використати каскадне видалення
ON DELETE CASCADEпри створенні зовнішнього ключа. - Видалити пов'язані записи вручну перед видаленням запису з основної таблиці.
Приклад ручного видалення пов'язаних даних:
-- спочатку видаляємо дані про студента 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
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ