|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
![]() ![]() |
Bonjour,
Je vous expose mon cas afin de vous demander conseil sur l'utilisation des contraintes de clés étrangères ON DELETE et ON UPDATE. Je fais une BBD qui répertorie de la documentation de cinéma. J'ai donc dans ma BDD des Films, des Artistes, des Festivals, des Documents et les tables de jointure et d'autres tables annexes qui vont avec. Mon problème est le suivant : Je peux trouver séparément de la documentation sur un même film, mais une fois selon son titre original (par exemple un article américain sur le tournage d'un film) et plus tard selon son titre français (par exemple un résumé lors de sa sortie en France), sans forcément savoir qu'il s'agit du même film. Je peux donc créer deux lignes dans la table Films, l'une avec seulement le titre original, l'autre avec seulement le titre français. A chacun de ces films (qui sont en fait le même, vous suivez toujours ?) sera référencée la documentation trouvée ainsi que des liens par exemple vers les artistes qui ont participé au film. Je peux ainsi avoir pour le film en version originale seulement le nom du réalisateur et pour le film avec son titre français un générique plus complet. Les clés étrangères dans la table FilmsArtistes vont me permettre de faire le rapprochement à chaque fois. Jusque là tout va bien. Plus tard, je découvre que ces deux films n'en sont qu'un. Je veux donc supprimer une des deux fiches et associer à celle qui reste tous les liens qu'elle possédait avec d'autres tables (Documents, Artistes, Festivals éventuellement). Vaut-il mieux que j'utilise les contraintes de clés étrangères pour détecter les liens, automatiser le transfert et surveiller la suppression ou bien gérer tout ça dans mon programme d'accès à la base ? Dans ce dernier cas, l'idée que j'ai est d'afficher la seconde fiche avec tous ses liens et un bouton pour valider le tranfert et la suppression de la seconde fiche. Qu'en pensez-vous ? |
|
00
|
|
|
#2 |
![]() ![]() ![]() Cédric DuprezInscription : avril 2002 Messages : 3 823 ![]() |
Bonjour,
A priori, rien ne permet au SGBD de trouver la fiche identique à celle que tu souhaites supprimer. C'est donc à l'application de créer le nouveau lien. Les contraintes de clef étrangères ne permettent pas de détecter des liens. C'est bien à l'application de permettre la mise en relation de deux fiches. ced |
|
|
00
|
|
|
#3 |
![]() ![]() |
Ah bon ! Peut-être me suis-je mal exprimé ? Ou alors j'ai mal compris comment marchent les contraintes ?
Si je mets une contrainte ON DELETE RESTRICT et que j'essaie de supprimer un film qui a des artistes et/ou des documents et/ou des festivals, MySQL devrait bien empêcher cette suppression et me retourner une erreur, non ? Dans ce cas l'idée serait d'exploiter l'erreur dans mon programme. Sinon l'autre solution est de ne pas mettre de contrainte et de vérifier, par programme et avant toute suppression, que des lignes filles n'existent pas dans d'autres tables. Ce cas me semble plus lourd et plus compliqué que le premier puisqu'il demande de multiples interrogations de la BDD alors que le premier cas est un peu plus automatique. |
|
00
|
|
|
#4 |
![]() ![]() ![]() Cédric DuprezInscription : avril 2002 Messages : 3 823 ![]() |
Tout à fait. On a dû mal se comprendre
MySQL va bien bloquer les suppressions, avec le mot clef RESTRICT, des lignes parent qui ont des lignes enfant associées. Et cette erreur est bien évidemment récupérable au niveau du programme. Ce que je voulais dire, c'est que MySQL ne peut pas réaffecter tout seul un enfant à un parent, sauf éventuellement à mettre une valeur par défaut. ced |
|
|
00
|
|
|
#5 |
![]() ![]() |
OK merci. Je vais faire comme ça alors, ça me semble plus logique.
|
|
00
|
Copyright © 2000-2012 - www.developpez.com