Developpez.com - SGBD & SQL
X

Choisissez d'abord la catégorieensuite la rubrique :


Requêtes DELETE avec Oracle 9i DataBase

07/09/2003

Par giminik (Matthieu Petiot) (autres articles)
 

niveau : normal

durée : 20 minutes

Cet article vous guidera dans l'effacement de données dans des tables déjà existantes. Il est destiné aux débutants qui souhaitent apprendre et visualiser les résultats que produisent les requêtes SQL. Il suppose toutefois que vous ayez tout de même quelques connaissances du SQL.
J'adresse mes remerciements à armatatuxa qui a gracieusement relu cet article et corrigé les fautes d'orthographe.


Introduction
1. Intérêt de la clause DELETE
1.1. Importance de la clause WHERE
1.2. Attention au respect des contraintes
2. DELETE avec sous-requete
3. DELETE avec sous-requête synchronisée
4. Exemple d'un DELETE pouvant poser problème
5. Conclusion


Introduction


Nous allons maintenant procéder à l'effacement de données. L'effacement sert à supprimer des lignes d'une table. Elle est nécessaire lorsque des informations n'ont plus lieu d'être et, de ce fait, ne sont plus utiles. Oracle vérifie que les contraintes ne soient pas violées, si tel est le cas, un message d'erreur est retourné.


1. Intérêt de la clause DELETE


Marcel Legrand décide de démissionner, nous allons donc supprimer la ligne le concernant.

DELETE FROM employe
    WHERE nomEmp = 'Legrand'
        AND prenomEmp = 'Marcel' ;
   

Revient à faire :

DELETE employe
    WHERE nomEmp = 'Legrand'
        AND prenomEmp = 'Marcel' ;
   


1.1. Importance de la clause WHERE


Remarquez que si la clause WHERE est omise, toutes les lignes de la table employe sont supprimées.

Illustrons l'omission de cette clause. Avant toute chose faisons un COMMIT ; pour sauvegarder les modifications récemment apportées. De ce fait, après avoir testé la requête sans clause WHERE il suffira de faire un ROLLBACK ; pour revenir à la précédente sauvegarde.

COMMIT ;
DELETE FROM employe ;
SELECT *
FROM employe ;

Oracle répond : aucune ligne sélectionnée.

ROLLBACK ;

La précédente sauvegarde vient d'être restaurée, et nous allons donc pouvoir continuer à travailler.


1.2. Attention au respect des contraintes


Il est impossible de supprimer des lignes dépendantes d'autres lignes. Dans la table departement, il est possible de supprimer la ligne Prototype car aucun n'employé n'est rataché à elle. Pour les autres lignes, un message d'erreur sera retourné.

DELETE FROM departement ;

Oracle renvoie : ORA-02292: violation de contrainte (SCOTT.EMPLOYE_IDDEP_FK) d'intégrité - enregistrement fils existant. Aucune ligne n'est supprimée.


2. DELETE avec sous-requete


Supprimons l'employé Tourneur ayant le plus petit salaire de sa fonction.

DELETE FROM employe
WHERE idEmp = (
    SELECT idEmp
    FROM employe
        NATURAL JOIN fonction
    WHERE salaireEmp = (
        SELECT MIN (salaireEmp)
        FROM employe
            NATURAL JOIN fonction
        WHERE nomFonc = 'Tourneur'
        )
        AND nomFonc = 'Tourneur'
    );

Attention : pour pouvoir supprimer un employé, celui-ci ne doit pas être le supérieur d'un autre employé, afin de ne pas violer les contraintes d'intégrité.


3. DELETE avec sous-requête synchronisée


Le patron décide de supprimer les départements qui n'ont pas d'employé. Dans ce cas là, seul le département Prototype devrait être supprimé. Pour ce faire, il est nécessaire d'utiliser l'opérateur EXISTS afin de détecter la présence des employés.

DELETE FROM departement d
    WHERE NOT EXISTS (
        SELECT idEmp
        FROM employe e
        WHERE d.idDep = e.idDep
    );


4. Exemple d'un DELETE pouvant poser problème


Damien Crozac démissionne. Il est impossible de supprimer directement cet employé car il est référencé en tant que supérieur par Julien Magin. Il faut donc changer cette référence, afin de pouvoir effectuer la suppression. Nous allons affecter comme supérieur à Julien Magin, le chercheur Jean Marie Popol.

UPDATE employe
    SET supEmp = (
        SELECT supEmp
        FROM employe
        WHERE nomEmp = 'Crozac'
            AND prenomEmp = 'Damien'
        )
    WHERE nomEmp = 'Magin'
        AND prenomEmp = 'Julien' ;
   
DELETE FROM employe
    WHERE nomEmp = 'Crozac'
        AND prenomEmp = 'Damien' ;
   

Vous venez donc de supprimer un employé, en attendant de trouver un remplaçant. Vous pouvez bien entendu vérifier qu'il n'est plus présent à l'aide d'un :

SELECT nomEmp, prenomEmp
FROM employe ;


5. Conclusion


Vous savez maintenant supprimer des données. Nous allons passer au châpitre suivant : modification et effacement des tables.



Ce document est issu de http://www.developpez.com et reste la propriété exclusive de son auteur.
La copie, modification et/ou distribution par quelque moyen que ce soit est soumise à l'obtention préalable de l'autorisation de l'auteur.
Contacter le responsable de la rubrique SGBD & SQL