Supprimer, c’est pas juste une fonction, c’est carrément un art ! Faut virer pile ce qu’il faut, sans toucher au reste (les données supprimées par erreur peuvent te hanter longtemps dans tes cauchemars). Aujourd’hui, on va apprendre à faire ça proprement et dans les règles !
Supprimer des données, c’est le process où tu enlèves une ou plusieurs lignes d’une table, parce qu’elles ne collent plus à la logique métier ou aux besoins de ton système. Genre, tu dois supprimer les infos sur des étudiants qui ont fini leurs études ou qui ont, euh, grave enfreint les règles de la fac. Ou alors, tu veux juste nettoyer une table pour garder que les infos à jour.
On utilise la suppression de données dans les cas suivants :
- Suppression des infos sur les utilisateurs qui ne sont plus actifs.
- Nettoyage des tables des enregistrements temporaires.
- Suppression des doublons.
- Suppression des vieux enregistrements selon une logique métier définie.
Syntaxe de la commande DELETE
Pour supprimer des données, on utilise la commande DELETE. Voilà la syntaxe de base :
DELETE FROM table
WHERE condition;
Les éléments principaux :
DELETE FROM— la phrase clé pour dire qu’on veut supprimer des lignes d’une table.- table — le nom de la table d’où tu veux virer des données.
WHERE condition— la condition pour filtrer les lignes à supprimer. Tu peux utiliser tous les opérateurs de comparaison, les opérateurs logiques (AND,OR,NOT) et même des sous-requêtes.
Exemple : imagine qu’on a une table students, et qu’on veut supprimer l’étudiant avec l’ID = 5 :
DELETE FROM students
WHERE id = 5;
Cette requête va supprimer la ligne de la table students où l’identifiant de l’étudiant (colonne id) vaut 5.
Attention : si tu oublies de mettre la condition WHERE, PostgreSQL va supprimer toutes les lignes de la table. Ce genre d’erreur peut être catastrophique, surtout si tu bosses sur un système en prod.
Suppression de toutes les lignes d’une table
Si tu veux supprimer toutes les lignes d’une table, tu peux carrément faire une requête sans condition WHERE. Par exemple :
DELETE FROM students;
Cette requête va supprimer tous les enregistrements de la table students. Mais la structure de la table reste — elle n’est pas supprimée, elle sera juste vide.
Alternative : TRUNCATE
Pour supprimer toutes les lignes d’une table, tu peux aussi utiliser la commande TRUNCATE. Elle est plus rapide que DELETE, car elle ne log pas la suppression de chaque ligne dans le journal des transactions. Exemple :
TRUNCATE TABLE students;
Différences entre DELETE et TRUNCATE :
DELETEécrit chaque suppression dans le journal des transactions, donc tu peux les annuler si besoin.TRUNCATEne supporte pas les conditions (WHERE) et ne log pas chaque suppression, donc c’est plus rapide mais moins flexible.
Si tu veux juste vider une table, TRUNCATE est top. Mais si tu dois supprimer qu’une partie des données ou pouvoir annuler, mieux vaut DELETE.
Suppression de données avec des conditions complexes
Les conditions dans DELETE peuvent être simples ou bien plus velues, avec des opérateurs logiques (AND, OR, NOT) ou même des sous-requêtes. Mate cet exemple.
Exemple 1 : Suppression de plusieurs enregistrements On va supprimer tous les étudiants qui ont plus de 30 ans et qui n’ont pas assisté aux cours depuis 3 mois :
DELETE FROM students
WHERE age > 30 AND last_attendance_date < (CURRENT_DATE - INTERVAL '3 months');
Cette requête ne supprimera que les étudiants qui remplissent les deux conditions en même temps.
Exemple 2 : Suppression avec une sous-requête
Imaginons qu’on a une table failed_students où on stocke les IDs des étudiants virés pour échec académique. On veut les supprimer de la table principale students :
DELETE FROM students
WHERE id IN (SELECT student_id FROM failed_students);
Ici, la sous-requête renvoie tous les IDs d’étudiants de la table failed_students, et la commande DELETE vire les lignes correspondantes de la table students.
Conseil
Avant de supprimer quoi que ce soit, écris un SELECT qui affiche les données que tu veux supprimer. Ensuite, tu remplaces juste le SELECT par DELETE, et ça supprimera exactement les mêmes lignes que tu viens de voir.
Exemple d’utilisation pratique
Imaginons qu’un étudiant avec l’ID = 7 décide de changer d’université. On va supprimer toutes ses infos de notre table :
DELETE FROM students
WHERE id = 7;
Vérifie la table après la commande pour être sûr que l’enregistrement a bien sauté :
SELECT * FROM students WHERE id = 7;
Si tu ne trouves plus d’enregistrement avec ID = 7, la suppression a marché.
Avertissements et erreurs classiques
Section WHERE oubliée
Une des erreurs les plus courantes avec DELETE, c’est d’oublier la section WHERE. Résultat : tu vires toutes les lignes de la table, et là c’est la cata. Vérifie toujours tes requêtes avant de les lancer.
Exemple de boulette :
DELETE FROM students;
-- Oups ! Suppression de tous les étudiants.
Pour éviter ce genre de fail, il vaut mieux tester la condition WHERE avec un SELECT avant de lancer le DELETE. Par exemple :
SELECT * FROM students WHERE id = 5;
Si le résultat te va, tu peux lancer le DELETE tranquille.
Suppression de données liées
Si ta table a des clés étrangères (FOREIGN KEY), tu peux avoir une erreur en supprimant des données. Ça arrive si la ligne à supprimer est liée à d’autres enregistrements. Par exemple, si un étudiant est inscrit à un cours dans la table enrollments, PostgreSQL ne te laissera pas le supprimer de students.
Pour régler ça, tu peux :
- Utiliser la suppression en cascade
ON DELETE CASCADEquand tu crées la clé étrangère. - Supprimer manuellement les enregistrements liés avant de supprimer la ligne principale.
Exemple de suppression manuelle des données liées :
-- d’abord on supprime les infos sur l’étudiant 5 dans enrollments
DELETE FROM enrollments
WHERE student_id = 5;
-- ensuite on supprime l’étudiant 5 lui-même
DELETE FROM students
WHERE id = 5;
Suppression avec transactions
Pour les suppressions critiques, pense à utiliser des transactions. Comme ça, tu peux annuler si tu fais une erreur.
Exemple de suppression dans une transaction :
BEGIN;
DELETE FROM students
WHERE id = 42;
-- On vérifie le résultat
SELECT * FROM students WHERE id = 42;
-- Si tout est ok, on valide
COMMIT;
-- Sinon, on annule
-- ROLLBACK;
On verra les transactions plus en détail dans les prochaines leçons :P
GO TO FULL VERSION