3. Supprimer des données : delete

3.1. Forme générale du delete

La suppression des données n'est pas toujours nécessaire ni désirée dans une base de données. Il arrive parfois même, dans les bases d'archive, qu'elle soit interdite, sauf pour des raisons purement techniques. Il n'empêche que, dans de nombreux cas, effacer des données devenues inutiles devient une nécessité, ne fut-ce que pour des raisons de performances. L'effacement d'une donnée peut devenir très problématique, même dans les structures de bases (raisonnablement) simples. Le principal problème que cela peut poser est celui de l'intégrité référentielle, c'est-à-dire des références croisées entre clés primaires. D'une façon générale, on s'interdit d'effacer une donnée référencée par un autre. Si cette donnée est obsolète, mais que la première ne l'est pas, il n'y a pas d'autre choix que de conserver la première. C'est un peu ainsi que des bases se transforment en tas de données, perdent petit à petit leur structure, que des doublons apparaissent, et que les choses deviennent de plus en plus inutilisables. La forme générale d'un delete est la suivante.

Exemple 51. Forme générale du delete

DELETE  FROM nom_de_table
   [WHERE predicat]

La clause where est facultative. S'il n'y en a pas, alors tout le contenu de la table passée en paramètre est effacé. Une précaution élémentaire avant d'exécuter un delete est d'effectuer un select avec la même clause where. Cela permet de vérifier que les données qui vont être effacées sont bien les bonnes, et de prévenir d'éventuels désastres. Notons que l'on peut effectuer des sous-requête dans la clause where d'une delete.

3.2. Effacement en cascade

Comme il a été dit, la présence d'une clé étrangère peut empêcher l'effacement d'un enregistrement. Il y a un moyen de remédier à cela, lors de la déclaration de cette clé étrangère. Si cette clé a été créée avec l'option on cascade delete, alors l'effacement est possible, et toutes les données qui référencent la donnée que l'on efface seront effacées aussi. Ce mécanisme est très pratique à condition qu'il soit parfaitement maîtrisé. Dans le cas contraire, un effacement a priori anodin peut entrainer l'effacement de quantités d'autres données, sans qu'il soit réellement possible de prévoir lesquelles de façon simple. L'option on cascade delete est à manipuler avec les plus grandes précautions.

3.3. Fonctionnement du delete

Le fonctionnement du delete suit une ordre très précis, très important dans certains cas. Le serveur procède en deux temps. Tout d'abord, il commence par balayer la table à la recherche des lignes qui vérifient la condition indiquée. Il marque chacune de ces lignes, qui seront être effacées par la suite. Dans un second temps, il efface les lignes marquées. Cet effacement peut d’ailleurs être un processus commun à toutes les tables, qui vide les données marquées à intervalles de temps réguliers. Voyons sur un exemple pourquoi cette façon de faire est importante. Supposons que l'on veuille effacer les marins de notre table, dont l'âge est inférieur à l'âge moyen des marins.

Exemple 52. Effacement dont la clause dépend de ce qui est effacé

delete  from Marins
    where ddmort - ddnaissance < 
      (select avg(ddmort - ddnaissance)  from Marins) ;

Dans ce cas, la requête imbriquée est tout d’abord évaluée, et le résultat comparé à la soustraction. Ces deux opérations sont faites à chaque ligne. Si l’effacement était immédiat, le résultat du calcul de la moyenne changerait à chaque ligne, le résultat final de l’opération changerait suivant l’ordre dans lequel les lignes seraient traitées. Comme le calcul se fait en deux passes, le processus fonctionne comme attendu. Dans un premier temps, les lignes à effacer sont marquées, mais sont toujours prises en compte dans le calcul de la moyenne. Une fois toutes les lignes examinées, les effacements sont effectués.
Introduction à SQL
Retour au blog Java le soir
Cours & Tutoriaux
Table des matières
Introduction
1. Un peu d'histoire
2. Organisation de la présentation
Un premier exemple
1. Un premier exemple
1.1. Construction d'une première table
1.2. Enregistrer quelques données
1.3. Extraire des données
2. Trier, classer, calculer
2.1. Classer des données
2.2. Trier des données
2.3. Effectuer des calculs
2.4. Mise à jour d'une valeur
3. Sélection sur plusieurs tables
3.1. Ajout du lieu de naissance
3.2. Clés primaires et clés étrangères
Organisation des données
1. Introduction
2. Bases de données, schémas et tables
2.1. Création d'une table
2.2. Création d'une colonne
2.3. Contraintes sur une table
2.4. Nommage des contraintes
2.5. Exemples de création de tables
2.6. Modification d'une table
2.7. Effacement d'une table
2.8. Remarques sur restrict et cascade
3. Types de données
3.1. Les types numériques
3.2. Les types caractère
3.3. Les types temporels
3.4. Les types binaires
3.5. Type auto-incrémental de MySQL
3.6. Type auto-généré de Derby
3.7. Séquences d'Oracle
Manipulation des données
1. Introduction
2. Extraire des données : select
2.1. Extraire des données d'une table unique
2.2. Clause where
2.3. Requêtes imbriquées
2.4. Fonctions d'agrégation, groupage
3. Supprimer des données : delete
3.1. Forme générale du delete
3.2. Effacement en cascade
3.3. Fonctionnement du delete
4. Ajouter des données : insert
4.1. Forme générale de l' insert
4.2. Copie d'une table dans une autre
5. Mettre à jour des données : update
5.1. Forme générale de l' update
5.2. Mise à jour avec une requête imbriquée
Interrogations sur plusieurs tables
1. Introduction
2. Formes normales
2.1. Première forme normale
2.2. Deuxième forme normale
2.3. Troisième forme normale
2.4. Formes normales d'ordres supérieurs
3. Relations entre éléments
3.1. Cardinalité d'une relation
3.2. Relation 1:1
3.3. Relation 1:p
3.4. Relation p:1
3.5. Relation n:p
4. Jointures
4.1. Jointure interne
4.2. Jointure externe
4.3. Auto-jointure
5. Unions
6. Vues
6.1. Création d'une vue
6.2. Exemples de vues
Transactions
1. Introduction
2. Isolation des transactions
2.1. ACIDité d'une transaction
2.2. Définition de l'isolation
3. Gestion d'une transaction
3.1. Mode auto-commit
3.2. Fixer le niveau d'isolation
3.3. Démarrer une transaction
3.4. Terminer une transaction
3.5. Remarques importantes
Index
1. Introduction
2. Manipulation d'index
2.1. Création automatique d'index
2.2. Création manuelle d'index