|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | |
|
Membre régulier
![]() Inscription : février 2006 Messages : 348 ![]() |
Bonjour,
J'ai une base de données qui comporte 3 tables. La première table est nommée A, la seconde B et la troisième C. Les tables B et C, récupère l'ID de la table A. Et la table A a une colonne qui fait référence à son ID, nommée ID_PARENT. Lors de la suppression d'une donnée de la table A, dont l'ID n'a aucune référence dans sa table au niveau de la colonne ID_PARENT, elle se supprime sans problème dans la table A mais aussi les données de la table B et C qui ont pour référence l'ID de la donnée supprimé dans la table A. Cependant lorsque je veux supprimer une donnée dans la table A mais qui a une référence dans une autre donnée de la même table dans la colonne ID_PARENT, il me fait une erreur... Citation:
Est-ce assez explicite ? Avez vous une idée sur mon problème ? Ah encore une chose sur ma table B et C il était possible de rajouter la contrainte ON DELETE CASCADE, cependant je n'ai pas pu le faire sur la colonne d'auto-référencement de la table A. En vous remerciant.
__________________
Programmer c'est comme gravir une montagne... Il faut procéder par étapes... (? auteur ?) Un seul être vous manque et tout est dépeuplé. Lamartine (merci chat hotplug ^^) |
|
|
|
00
|
|
|
#2 | ||
|
Membre régulier
![]() Inscription : février 2006 Messages : 348 ![]() |
J'ai peut être commencé à trouver un début de réponse mais je ne suis pas sûr...
En faite j'exécute directement ma requête dans le deletecommand de mon gridview... Et pour éviter toute erreur je pensais modifier s'il y a, les données ayant pour id_parent l'id de la donnée que l'on voudrais supprimer et le mettre à null... J'ai déjà essayé ça pour le moment mais ça fonctionne pas... Code :
En vous remerciant.
__________________
Programmer c'est comme gravir une montagne... Il faut procéder par étapes... (? auteur ?) Un seul être vous manque et tout est dépeuplé. Lamartine (merci chat hotplug ^^) |
||
|
|
00
|
|
|
#3 | ||
|
Membre actif
![]() |
Bonjour,
Tu n'as qu'à ajouter la contrainte sur tes table B et C ainsi ; Code :
http://www.developpez.net/forums/d45...de-sql-server/ ++
__________________
You probably have a very easy job, the kind robots will be doing soon. |
||
|
|
00
|
|
|
#4 | |||
|
Membre régulier
![]() Inscription : février 2006 Messages : 348 ![]() |
Merci witch pour ta réponse mais je crois que je vais illustrer un peu mon problème pour que ce soit plus clair.
Exemple de ma table A : Code :
Exemple de ma table C qui a la contrainte ON DELETE CASCADE sur son id_a : Si je supprime mon premièr enregistrement dans ma table A, les enregistrements qui s'y rapportent dans la table B et C sont supprimés aussi. Cependant si j'essaie de supprimer dans ma table A cette donnée (qui a pour id l'id_parent d'un autre enregistrement) ... Je ne peux pas ce qui est logique quelque part à cause de la contrainte qui fait que la colonne id_parent est liés à la colonne id de la table A. Est-ce un peu plus compréhensible ? Le plus simple aurait été d'inclure dans la création de la table A une contrainte ON DELETE CASCADE sur id_parent de la table A, mais ce ne fut pas possible... Voici le message que j'avais quand je voulais lui mettre cette contrainte : Citation:
Et je voudrais appeler cette fonction dans ma page .aspx dans la commande deletecommand de mon gridview.
__________________
Programmer c'est comme gravir une montagne... Il faut procéder par étapes... (? auteur ?) Un seul être vous manque et tout est dépeuplé. Lamartine (merci chat hotplug ^^) |
|||
|
|
00
|
|
|
#5 |
![]() ![]() |
Une solution, pas forcément très élégante, serait d'autoriser id_parent à être NULL et mettre un ON DELETE SET NULL.
Une solution plus élégante consiste à modifier le modèle de données en externalisant les parents : Parent (id_enfant, id_parent) Ainsi, plus de problème pour mettre ON DELETE CASCADE sur cette table. Et avec une vue sur les deux tables, tu reconstitues l'actuelle. Par contre, s'il y a des petits enfants, ça peut poser problème ! Il faudrait alors mettre en oeuvre un trigger. D'ailleurs, à la réflexion vite fait, je crois qu'un trigger est de toute façon nécessaire car dans la table principale l'enfant ne sera pas supprimé.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework... « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau) À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française ! Linuxiens, comptez-vous ! |
|
00
|
|
|
#6 | |||
|
Membre Expert
![]() ![]() Inscription : janvier 2010 Messages : 1 084 ![]() |
Citation:
ta table s'appelle property ??? loin d'être judicieux comme nom de table ! c'est un mot clef... d'autre part, ça n'est pas id_property qui doit être mis à null mais id_parent essaie donc comme ca : Code sql : UPDATE PROPERTY SET id_parent = NULL WHERE id_parent = @id_property DELETE FROM PROPERTY WHERE id_property = @id_property (si j'ai bien compris, tu souhaites quand même conserver tes lignes enfant, simplement les détacher de leur parent ?) heu... tu crains pas d'avoir la DDASS sur le dos ? ok je sors ... |
|||
|
|
00
|
|
|
#7 |
|
Membre régulier
![]() Inscription : février 2006 Messages : 348 ![]() |
Bonjour !
Merci CinePhil et aieeeuuuuu pour vos réponses ! ![]() Grâce à la dernière solution ça fonctionne très bien ! Merci encore ! Bonne journée.
__________________
Programmer c'est comme gravir une montagne... Il faut procéder par étapes... (? auteur ?) Un seul être vous manque et tout est dépeuplé. Lamartine (merci chat hotplug ^^) |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com