Envoyé par
ganguill
Je m'étais débrouillé pour avoir des clés étrangères entre certaines tables.. Seulement je viens de me dire un truc: maintenant que mon application est en place et que l'utilisateur peut supprimer les tables qu'il souhaite dans n'importe quel ordre, ce dernier risque de se retrouver coincé s'il veut supprimer une table reliée à une autre par une clé étrangère!
Je ne peux qu'être d'accord avec Mnitu sur ce point : ce que vous tentez de faire est incohérent.
Il n'est pas normal de supprimer et recréer régulièrement les mêmes tables.
A la rigueur, si vous voulez les vider intégralement, vous avez le TRUNCATE.
Par ailleurs, si vous mettez des clés étrangères, c'est pour renforcer l'intégrité de vos données : ces clés étrangères assurent que les valeurs que vous entrez dans la table T sont valables, car présentes dans une table de référence TR.
Cela induit donc une certaine chronologie des actions : d'abord on insère la donnée de référence dans TR, puis on insère dans T une valeur y faisant référence.
De même, à la suppression des tables, la cohérence impose que vous supprimiez d'abord T, puis TR.
Quand vous dites que l'utilisateur doit pouvoir supprimer les tables dans n'importe quel ordre, c'est une exigence incohérente. Soit ils ne comprennent rien à la logique de leurs données (ce qu'on peut admettre, dans ce cas il faut leur fournir une procédure unique qui se chargera de supprimer les tables dans le bon ordre), soit ils la comprennent et dans ce cas ils doivent accepter l'erreur, soit c'est votre logique qui est mauvaise.
Si vous voulez bénéficier des contrôles effectués par les clés étrangères, il faut accepter la chronologie imposée lors de la suppression des tables, ce que je vous conseille.
Sinon, ne mettez pas de clés étrangères, ce qui vous permettra de supprimer vos tables n'importe comment, mais acceptez aussi les incohérences potentielles dans vos données !
Après, il reste la solution malpropre qui permet de supprimer une table brutalement en supprimant les clés étrangères qui y feraient référence :
DROP TABLE TR CASCADE CONSTRAINTS;
Concernant les tables temporaires suggérées par Mnitu, il faut rappeler qu'une table temporaire est une table permanente dont le contenu est temporaire. Ce contenu, dans le meilleur des cas, disparaîtra à la fin de la session, ce qui ne vous convient probablement pas.
Partager