[SQL] Suppression multi tables

Suppression multi tables [SQL] - PHP - Programmation

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 :

Code :
  1. mysql_query("
  2. DELETE pur_produits.id_fourn, pur_fournisseurs
  3. FROM pur_produits, pur_fournisseurs
  4. WHERE pur_produits.id_fourn = '$id' AND pur_fournisseurs.id = '$id'" ))


 
Mais elle me renvoit :

Code :
  1. Table inconnue 'id_fourn' dans MULTI DELETE


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€]
Reply

Marsh Posté le 13-05-2007 à 16:03:57   

Reply

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  :pt1cable:  
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.


Message édité par gocho le 13-05-2007 à 16:25:46
Reply

Marsh Posté le 13-05-2007 à 16:25:27    

Voici la structure de ma table :
 

Code :
  1. CREATE TABLE `pur_produits` (
  2.   `prd_id` mediumint(8) unsigned NOT NULL auto_increment,
  3.   `id_fourn` mediumint(8) unsigned NOT NULL default '0',
  4.   `prix_ttc` float(10,2) unsigned NOT NULL default '0.00',
  5.   `prix_promo` float(10,2) unsigned NOT NULL default '0.00',
  6.   `stock` mediumint(8) unsigned NOT NULL default '0',
  7.   `stock_mini` mediumint(8) unsigned NOT NULL default '0',
  8.   `delai` smallint(6) unsigned NOT NULL default '0',
  9.   `poids` mediumint(8) unsigned NOT NULL default '0',
  10.   `actif` tinyint(4) NOT NULL default '1',
  11.   PRIMARY KEY  (`prd_id`)
  12. ) ENGINE=MyISAM AUTO_INCREMENT=6 DEFAULT CHARSET=latin1 AUTO_INCREMENT=6 ;
  13. -- Structure de la table `pur_fournisseurs`
  14. --
  15. CREATE TABLE `pur_fournisseurs` (
  16.   `id` mediumint(8) unsigned NOT NULL auto_increment,
  17.   `nom` varchar(50) NOT NULL default '',
  18.   `adresse` text NOT NULL,
  19.   `code_postal` varchar(10) NOT NULL default '',
  20.   `ville` varchar(20) NOT NULL default '',
  21.   `pays` varchar(20) NOT NULL default '',
  22.   `email` varchar(50) NOT NULL default '',
  23.   `tel_fixe` varchar(15) NOT NULL default '',
  24.   `tel_mobile` varchar(15) NOT NULL default '',
  25.   `contact` varchar(20) NOT NULL default '',
  26.   `notes` mediumtext NOT NULL,
  27.   PRIMARY KEY  (`id`),
  28.   KEY `nom` (`nom`)
  29. ) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ;


 
Et le $id de ma requete correspond à un 'id' de pur_fournisseurs


Message édité par Mister_Pingouin76 le 13-05-2007 à 16:26:17

---------------
Goldbarre [Gains:23€] | Eurobarre [Gains:18€]
Reply

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 :p
 
 
Ceci dit, avec ta strucure, la, tu pourras avoir des produits provenant de fournisseur qui n'existe pas dans ta table fournisseur [:dawa]
je trouve pas cela tres logique, non?


Message édité par gocho le 13-05-2007 à 16:28:21
Reply

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 [:dawa]
je trouve pas cela tres logique, non?


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 :)


Message édité par Mister_Pingouin76 le 13-05-2007 à 16:30:32

---------------
Goldbarre [Gains:23€] | Eurobarre [Gains:18€]
Reply

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 :
  1. delete from pur_fournisseurs where id = $id
  2. delete from pur_produits where id_fourn = $id


 
 
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 :)


Message édité par gocho le 13-05-2007 à 16:31:55
Reply

Marsh Posté le 13-05-2007 à 16:34:08    

stop editing [:joce]
 
 
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

Reply

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é)


---------------
Goldbarre [Gains:23€] | Eurobarre [Gains:18€]
Reply

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 :)

Reply

Marsh Posté le 13-05-2007 à 16:41:43    

je sais pas trop comment expliquer ^^
 
Le schéma :

Code :
  1. pur_fournisseur :
  2.    id = 1 | nom : entreprise1
  3.    id = 2 | nom :entreprise2
  4. pur_produits :
  5.    id=1 | id_fourn=2  | nom = produit1
  6.    id=2 | id_fourn=2  | nom = produit2
  7.    id=3 | id_fourn=1  | nom=produit3


 
Et faire une requete pour obtenir ce resultat pour $id=2
 

Code :
  1. pur_fournisseur :
  2.    id = 1 | nom : entreprise1
  3.    //id = 2 | nom :entreprise2     <-- supprimé car $id=2
  4. pur_produits :
  5.    id=1 | id_fourn=0  | nom = produit1
  6.    id=2 | id_fourn=0  | nom = produit2  <-- les champs id_fourn=$id sont supprimés
  7.    id=3 | id_fourn=1  | nom=produit3


 
EDIT : j'ai changé, c'est id_fourn et pas prd_id ^^


Message édité par Mister_Pingouin76 le 13-05-2007 à 16:44:33

---------------
Goldbarre [Gains:23€] | Eurobarre [Gains:18€]
Reply

Marsh Posté le 13-05-2007 à 16:41:43   

Reply

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 ;)


Message édité par gocho le 13-05-2007 à 17:09:08
Reply

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 ? :)


Message édité par Mister_Pingouin76 le 13-05-2007 à 17:09:34

---------------
Goldbarre [Gains:23€] | Eurobarre [Gains:18€]
Reply

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?

Reply

Marsh Posté le 13-05-2007 à 17:16:14    

euh non je ne pense pas :/


---------------
Goldbarre [Gains:23€] | Eurobarre [Gains:18€]
Reply

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.


Message édité par gocho le 13-05-2007 à 17:30:57
Reply

Marsh Posté le 13-05-2007 à 17:28:13    

un peu des 2 :)
en cours on nous demande pas tout ça ^^
je ferai des recherches sur foreign key alors :)


---------------
Goldbarre [Gains:23€] | Eurobarre [Gains:18€]
Reply

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 ;)


---------------
Goldbarre [Gains:23€] | Eurobarre [Gains:18€]
Reply

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 ;-)

Message cité 1 fois
Message édité par gocho le 13-05-2007 à 19:48:41
Reply

Marsh Posté le 20-05-2007 à 21:39:29    

gocho a écrit :

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 ;-)


 
 
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 :)

Reply

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" ...

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed