Suppression multi tables [SQL] - PHP - Programmation
Marsh Posté le 13-05-2007 à 16:22:27
id_fourn est une clé étrangere, qui référence la table pur_fournisseurs?
edit :c'est juste pour info, hein!
ceci dit, ton delete marchera pas, tu cherche a supprimer le champ id_fourn de ta table
ca va pas etre possible hein.
Si tu as ces deux tables et que tu souhaites supprimer un fournisseur.
1 -d'abord, tu commences par supprimer tous les produits de ce fournisseur de ta table pru_produits
2 -ensuite, tu supprime le fournisseur de ta table pur_fournisseurs.
Marsh Posté le 13-05-2007 à 16:25:27
Voici la structure de ma table :
Code :
|
Et le $id de ma requete correspond à un 'id' de pur_fournisseurs
Marsh Posté le 13-05-2007 à 16:27:28
j'ai edité mon premier message.
edit : mais mon edit ne convient pas, vu que tu n'as pas de clé etrangere
Ceci dit, avec ta strucure, la, tu pourras avoir des produits provenant de fournisseur qui n'existe pas dans ta table fournisseur
je trouve pas cela tres logique, non?
Marsh Posté le 13-05-2007 à 16:28:20
Et y'a pas moyen de le faire en une seule fois ?
Genre je supprime tous les enregistrements des 2 tables où l'id de fournisseur = $id ou le prd_id de pur_produits = $id ?
EDIT : lol, ca enchaine trop vite pour moi ^^
Citation : Ceci dit, avec ta strucure, la, tu pourras avoir des produits provenant de fournisseur qui n'existe pas dans ta table fournisseur |
C'est justement pour ça que je voudrais que dès que je selectionne un id de fournisseur à supprimer, je supprime par la même occasion tous les prd_id correspondant à ce fournisseur (et je les mets à 0), après l'entreprise change de fournisseur par exemple
Marsh Posté le 13-05-2007 à 16:30:29
euhhh, je sais pas trop si ca peut marcher.
sinon tu fais en deux fois.
Code :
|
edit :
en fait non, ca marchera pas. Ton champ n'est deja pas le meme, et sans s'occuper de cela, je crois meme pas que ce soit possible ni meme conseillé.
Pourquoi preferer faire cela en une fois?
Vaut mieux que tu aies deux requetes (et je crois pas que tu aies le choix) et que ca soit lisible et propre
Marsh Posté le 13-05-2007 à 16:34:08
stop editing
alors reprenons.
Deja pour ton probleme de fournisseur de produit, il faudrait que id_fourn reference la table pur_fournisseurs
ensuite, pour faire ta suppression, tu supprime d'abord tous les produits, puis la ligne de la table pur_fournisseurs
Marsh Posté le 13-05-2007 à 16:36:16
Ba je voulais me mettre aux requêtes multi-tables, histoire de pas en avoir 15 par page
Parce que supprimer tout un élément de pur_produits et un élément de pur_fournisseurs en même temps, ça y'a pas de problème.
Mais ce qui me pose problème c'est juste de supprimer un fournisseur à partir d'un id et en même temps supprimer toutes les valeurs de prd_id qui y sont égales (et non pas tout le produit enregistré)
Marsh Posté le 13-05-2007 à 16:37:18
comment ca :
"supprimer tout un élément de pur_produits et un élément de pur_fournisseurs en même temps"
je comprends pas ce que tu veux dire.
Montre ta requete qui fais ca, stp
Marsh Posté le 13-05-2007 à 16:41:43
je sais pas trop comment expliquer ^^
Le schéma :
Code :
|
Et faire une requete pour obtenir ce resultat pour $id=2
Code :
|
EDIT : j'ai changé, c'est id_fourn et pas prd_id ^^
Marsh Posté le 13-05-2007 à 17:06:52
oui j'avais compris cela en relisant apres coup
En fait, le probleme c'est que tu cherches pas du bon coté.
Comme tu l'a dit, tu souhaite garder ta ligne produit, en mettant par exemple id_fourn à 0 c'est bien ca?
Et bien le seul moyen pour faire cela, ce n'est pas de supprimer le champ id_fourn (ce qui, de toute facon, n'est pas possible (dans ce cas la)) mais de le mettre a jour.
Il faudra donc utiliser un update + un delete.
Tu ne pourras donc toujours pas tout faire en une requete
ps : et je persiste a dire que ta base pourra etre sujette a de gros problemes, considerant son etat actuel
et que si c'est pour un projet, ou un devoir je te conseille de revoir tout ca
Marsh Posté le 13-05-2007 à 17:09:26
oki, bon ba je m'avoue vaincu alors...
Et à quels problèmes tu fais allusion ?
Si c'est le fait que id_fourn sera alors à 0, j'ai une condition qui le traite ailleurs
D'ailleurs j'avais pas compris l'histoire du id_fourn en référence ?
Peux tu éclairer ma lanterne ?
Marsh Posté le 13-05-2007 à 17:11:49
c'est tout a fait à cela que je fais allusion.
Disons que tu n'utilises pas le concept de clé etrangère. Tu connais ou non?
Marsh Posté le 13-05-2007 à 17:26:03
foreign key?
tu fais ca pour les cours, ou c'est personnel?
bon disons que les clés etrangeres servent à "lier" des tables entre elles.
Sans cela, par exemple pour tes tables, tu peux avoir des données incoherentes.
imaginons que tu aies un produit ayant pour fournisseur le fournisseur 1.
Si tu supprime ton fournisseur, le produit existe toujours, et ce n'est pas normal.
Bien sur, si tu supprimes tout bien dans tes requetes, ca se verra pas, mais c'est une securité offertes par les bases de donnnées, donc autant s'en servir.
Si jamais tu avais une clé etrangere, quand tu essaies de supprimer le fournisseur, ca va te jeter en te disant qu'il existe des produits rattachés a ce fournisseur.
Marsh Posté le 13-05-2007 à 17:42:30
oki, mais le problème avec ça, c'est que si jamais ils décident juste de changer de fournisseur, ils doivent reposter le produit tout entier.
Alors que là, il leur suffit juste de modifier l'id_fourn parmi ceux restant (dans une liste déroulante en fait) ou d'en insérer un nouveau.
Et si la id_fourn reste toujours à 0, alors le fournisseur par défaut est utilisé.
Mais je penserai aux méthodes de clef étrangère maintenant, merci de me l'avoir fait connaître
Marsh Posté le 13-05-2007 à 17:45:52
oui, c'est le probleme avec ce que tu veux faire.
Apres, en poussant un peu plus loin, tu pourrais aussi avoir une table qui contient les produits, une table qui contient les fournisseurs, et une table qui fait office de liaison, c'est a dire qui dit quel fournisseur fournit quel produit.
donc une table : fournit ( id, id_produit)
ces deux clés etant bien evidemment des clés etrangeres issues de pur_produit et pur_fournisseur.
Cette conception te permet de garder tes produits intacts, et de pouvoir supprimer un fournisseur comme bon te semble, il suffira juste de supprimer ce qu'il faut dans la table "fournit"
edit : et tu pourra meme mettre a jour facilement tes changements de fournisseur
ajout : et c'est la meilleure conception (sans pousser a l'extreme dans les details, et sans analyse poussée) que je vois pour le moment
edit 2 : MP moi si tu veux plus de détails et/ou d'aide qui ne rentre pas en compte dans le topic ;-)
Marsh Posté le 20-05-2007 à 21:39:29
gocho a écrit : oui, c'est le probleme avec ce que tu veux faire. |
je ne suis pas trop d'accord (si vous permettrez )
cette façon de faire sous entends qu'un produit peut avoir plusieurs fournisseurs ce qui n'est pas très logique, alors que l'inverse est logique, d'où la présence de la clé étrangère fournisseur dans la tables des produits.
et pour le probleme de changement de fournisseur, soyons logique :
- soit on supprime ce fournisseur, donc ces produits aussi.
- soit on le modifie (update) du coup on touche pasaux produits mais ob a kes bonnes données de leur fournisseur.
- soit on modifie le produit en changeant son fournisseur.
donc le probleme ne se pose pas vraiment. du coup je ne vois pas trop l'utilité de supprimer un fournisseur avant d'en mettre un autre, ça s'appelle un update ça
Marsh Posté le 21-05-2007 à 09:57:37
si tu veux utiliser les clés étrangères en mysql, je crois qu'il faut des tables en InnoDB et regarde aussi les clauses "on delete cascade" et "on update cascade" ...
Marsh Posté le 13-05-2007 à 16:03:57
Bonjour
Voila mon petit probleme :
- Je possède 2 tables (pur_produits et pur_fournisseurs)
- pur_produits possède un champ 'id_fourn' qui correspond à un champ 'id' de pur_fournisseurs.
- je voudrais, quand je supprime un element de pur_fournisseurs, supprimer aussi la valeur de 'id_fourn' dans pur_produits si celle-ci correspond à l'id du fournisseur...
J'ai fait cette requête :
Mais elle me renvoit :
Je ne suis pas encore un pro des requêtes multi-tables alors, si quelqu'un a la solution...
merci d'avance
---------------
Goldbarre [Gains:23] | Eurobarre [Gains:18]