Suppressions
Le problème est plus délicat pour les suppressions. On a déjà défini ON DELETE SET NULL pour la clé sur Animal.race_id .
Prenons les autres clés une à une.
Clé sur Animal.espece_id
Si l'on supprime une espèce de la base de données, c'est qu'on ne l'utilise plus dans notre élevage, donc a priori, on n'a plus
besoin non plus des animaux de cette espèce. Sachant cela, on serait sans doute tentés de mettre ON DELETE CASCADE.
Ainsi, en une seule requête, tout est fait.
Cependant, les animaux sont quand même le point central de notre base de données. Cela me paraît donc un peu violent de les
supprimer automatiquement de cette manière, en cas de suppression d'espèce. Par conséquent, je vous propose plutôt de laisser
le ON DELETE RESTRICT. Supprimer une espèce n'est pas anodin, et supprimer de nombreux animaux d'un coup non plus. En
empêchant la suppression des espèces tant qu'il existe des animaux de celle-ci, on oblige l'utilisateur à supprimer d'abord tous
ces animaux. Pas de risque de fausse manœuvre donc.
Attention au fait que le ON DELETE SET NULL n'est bien sûr pas envisageable, puisque la colonne espece_id de la table
Animal ne peut pas être NULL.
Pas de changement pour cette clé étrangère !
Il s'agit de mon point de vue personnel bien sûr. Si vous pensez que c'est mieux de mettre ON DELETE CASCADE,
faites-le. On peut certainement trouver des arguments en faveur des deux possibilités.
Clés sur Animal.mere_id et Animal.pere_id
Ce n'est pas parce qu'on supprime un animal que tous ses enfants doivent être supprimés également. Par contre, mettre à NULL
semble une bonne idée. ON DELETE SET NULL donc !
Clé sur Race.espece_id
Si une espèce est finalement supprimée, et donc que tous les animaux de cette espèce ont également été supprimés auparavant
(puisqu'on a laissé ON DELETE RESTRICT pour la clé sur Animal.espece_id ), alors les races de cette espèce deviennent
caduques. On peut donc utiliser un ON DELETE CASCADE ici.
Les requêtes
Vous avez toutes les informations nécessaires pour écrire ces requêtes, je vous encourage donc à les écrire vous-mêmes avant
de regarder mon code.
Secret (cliquez pour afficher)
Code : SQL
-- Animal.mere_id --- ----------------ALTER TABLE Animal DROP FOREIGN KEY fk_mere_id;
ALTER TABLE Animal
ADD CONSTRAINT fk_mere_id FOREIGN KEY (mere_id) REFERENCES
Animal(id) ON DELETE SET NULL;
-- Animal.pere_id --- ----------------ALTER TABLE Animal DROP FOREIGN KEY fk_pere_id;
ALTER TABLE Animal
ADD CONSTRAINT fk_pere_id FOREIGN KEY (pere_id) REFERENCES
Animal(id) ON DELETE SET NULL;
-- Race.espece_id --- ----------------ALTER TABLE Race DROP FOREIGN KEY fk_race_espece_id;
ALTER TABLE Race
ADD CONSTRAINT fk_race_espece_id FOREIGN KEY (espece_id)
Partie 2 : Index, jointures et sous-requêtes
140/414
www.openclassrooms.com
Précédent

- 140/413

Suivant