Les instructions SQL UPDATE et DELETE sont des composants fondamentaux du langage de manipulation de données (DML) en Oracle. Elles permettent respectivement de modifier et de supprimer des enregistrements existants dans une table. L'utilisation correcte de ces commandes, particulièrement l'application précise de la clause WHERE, est essentielle pour garantir l'intégrité des données et éviter toute altération ou suppression non intentionnelle. Ce guide explore les spécificités de ces opérations en environnement Oracle.
1. Modifier les Données avec l'Instruction UPDATE
L'instruction UPDATE permet de mettre à jour les valeurs d'une ou plusieurs colonnes pour des lignes existantes dans une table. Sans la clause WHERE, l'opération s'applique à l'ensemble des enregistrements de la table.
1.1. Syntaxe de base
UPDATE nom_table
SET colonne1 = nouvelle_valeur1 [, colonne2 = nouvelle_valeur2 ...]
[WHERE condition_de_selection];
1.2. Exemple : Mise à jour d'une seule colonne
Pour ajuster le salaire d'un employé spécifique (ID 101) à 8500 :
UPDATE personnel
SET salaire = 8500
WHERE id_personnel = 101;
1.3. Exemple : Mise à jour de plusieurs colonnes
Pour modifier simultanément le prénom et l'affectation de service d'un employé (ID 102) :
UPDATE personnel
SET prenom = 'Sophie', id_service = 30
WHERE id_personnel = 102;
2. Supprimer les Enregistrements avec l'Instruction DELETE
L'instruction DELETE est utilisée pour supprimer des lignes spécifiques d'une table. Si la clause WHERE est omise, toutes les lignes de la table seront supprimées, mais la structure de la table restera intacte.
2.1. Syntaxe de base
DELETE FROM nom_table
[WHERE condition_de_suppression];
2.2. Exemple : Suppression d'enregistrements ciblés
Pour retirer tous les employés associés au service 40 :
DELETE FROM personnel
WHERE id_service = 40;
2.3. Exemple : Suppression de toutes les données (utilisation avec extrême prudence)
Pour vider l'intégralité d'une table :
DELETE FROM services;
Note : Pour une suppression massive et plus rapide des données d'une table, tout en conservant sa structure, l'instruction TRUNCATE TABLE est souvent préférée. Elle est plus efficace mais ne peut pas être annulée (ROLLBACK) et ne déclenche pas les triggers DELETE.
TRUNCATE TABLE services;
3. Bonnes Pratiques et Précautions
3.1. L'importance capitale de la clause WHERE
- Une condition
WHEREmal définie peut affecter involontairement un large ensemble de données. - L'omission de
WHEREentraînera une opération sur la table entière.
-- EXEMPLES D'ERREURS À ÉVITER :
UPDATE comptes_utilisateurs SET statut = 'actif'; -- Active potentiellement TOUS les comptes !
DELETE FROM journaux_systeme; -- Supprime TOUS les enregistrements de journal !
3.2. Sauvegarder les données avant les modifications majeures
Il est forteemnt recommandé de créer une sauvegarde des données avant d'exécuter des opérations UPDATE ou DELETE critiques, surtout en production.
-- Création d'une table d'archive et insertion des données à sauvegarder
CREATE TABLE personnel_archive AS
SELECT * FROM personnel WHERE 1=0; -- Crée une table vide avec la même structure
INSERT INTO personnel_archive
SELECT * FROM personnel
WHERE id_service = 40; -- Sauvegarde les enregistrements avant leur suppression
3.3. Gestion des contraintes d'intégrité (Clés Étrangères)
Les opérations de modification ou de suppression doivent tenir compte des contraintes de clé étrangère. Une violation peut empêcher l'exécution de la commande.
-- Supprimer d'abord les enregistrements des tables dépendantes
DELETE FROM details_commandes WHERE id_commande = 500;
DELETE FROM entetes_commandes WHERE id_commande = 500;
3.4. Verrouillage des ressources lors d'opérations sur de grands volumes
Les opérations de longue durée peuvent entraîner des verrous sur la table, bloquant d'autres transactions. Le traitement par lots ou l'utilisation explicite de transactions peut aider.
BEGIN
-- Suppression des journaux datant de plus d'un an
DELETE FROM traces_applicatives WHERE date_creation < SYSDATE - 365;
COMMIT;
END;
/
4. Techniques Avancées avec UPDATE et DELETE
4.1. Mises à jour via sous-requêtes
Utiliser une sous-requête pour déterminer dynamiquement les nouvelles valeurs à affecter.
-- Mettre à jour les prix des "Accessoires" avec le prix moyen des produits "Électronique"
UPDATE produits
SET prix_unitaire = (SELECT AVG(prix_unitaire) FROM produits WHERE categorie = 'Électronique')
WHERE categorie = 'Accessoires';
4.2. Suppression conditionnelle complexe
Combiner des conditions sophistiquées ou des sous-requêtes pour des suppressions précises.
-- Supprimer les utilisateurs inactifs n'ayant pas de connexion depuis plus de 6 mois
DELETE FROM utilisateurs
WHERE derniere_connexion < ADD_MONTHS(SYSDATE, -6)
AND statut = 'inactif';
4.3. La clause RETURNING (pour UPDATE et DELETE)
La clause RETURNING permet de récupérer les valeurs des lignes qui ont été affectées par l'opération UPDATE ou DELETE.
DECLARE
v_id_client NUMBER;
v_nom_client VARCHAR2(100);
BEGIN
DELETE FROM clients
WHERE statut = 'archivé'
RETURNING id_client, nom_client INTO v_id_client, v_nom_client;
-- Afficher les informations du client supprimé
DBMS_OUTPUT.PUT_LINE('Client archivé et supprimé : ID=' || v_id_client || ', Nom=' || v_nom_client);
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('Aucun client correspondant trouvé.');
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Une erreur est survenue : ' || SQLERRM);
END;
/
5. Erreurs Fréquentes et Solutions
5.1. ORA-01407: impossible de mettre à jour (...) avec une valeur NULL
- Cause : Tentative d'affecter une valeur NULL à une colonne qui est définie avec la contrainte
NOT NULL. - Solution : Fournir une valeur non NULL valide ou modifier la définition de la colonne pour autoriser les valeurs NULL si nécessaire.
5.2. ORA-02292: violation de contrainte d'intégrité - enregistrement enfant trouvé
- Cause : Tentative de suppression d'une ligne dans une table parente alors que des lignes dépendantes existent dans une table enfant via une clé étrangère.
- Solution : Supprimer d'abord les enregistrements correspondants dans la table enfant, ou configurer la contrainte de clé étrangère avec l'option
ON DELETE CASCADE.
5.3. ORA-01779: impossible de modifier une colonne qui correspond à une table non protégée par clé
- Cause : Tentative d'effectuer une opération
UPDATEsur une vue complexe où la colonne à modifier ne peut pas être mise à jour de manière univoque dans la table de base sous-jacente (par exemple, dans une vue basée sur une jointure sans clé primaire de la table cible). - Solution : Effectuer la mise à jour directement sur la table de base, ou s'assurer que la vue est basée sur une "table protégée par clé" (key-preserved table) qui permet des mises à jour directes.
6. Cas Pratiques
6.1. Augmentation des salaires par catégorie de poste
Augmenter le salaire de tous les 'Développeur Senior' de 5% :
UPDATE employes
SET salaire = salaire * 1.05
WHERE poste = 'Développeur Senior';
6.2. Suppression des sessions utilisateur expirées
Nettoyer les enregistrements de session dont la date d'expiration est dépassée :
DELETE FROM sessions_utilisateur
WHERE date_expiration < SYSTIMESTAMP;
6.3. Normalisation des données textuelles
Mettre en majuscule la première lettre de chaque mot dans les titres d'articles pour une meilleure uniformité :
UPDATE articles
SET titre = INITCAP(titre)
WHERE LENGTH(titre) > 0 AND titre != INITCAP(titre); -- Condition pour ne traiter que les titres non uniformisés