SQL Soucis clé étrangère

TRUNCKS Messages postés 1019 Date d'inscription   Statut Membre Dernière intervention   -  
TRUNCKS Messages postés 1019 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour à vous,

J'ai lu quelques tutos concernant les clé étrangères ( je suis sous phpmyadmin ) mais je n'arrive toujours pas à mettre en place un truc tout bête, je pense que j'ai une erreur de structure.

J'ai tout simplement deux tables: une table catégorie et une table produit.

Je peux que les produits soient affectés à une catégorie.
Que si la catégorie disparaît, tous les produits virent mais que si l'on supprime tous les produits, la catégorie reste.

J'ai fait cela:

Catégorie ( ID_catégorie (primaire), nom_categorie )

Produits ( ID_produit (primaire), nom produit, produit_id (étrangère) )

Ce n'est pas comme ça qu'il faut faire ?

Je me retrouve avec cela quand j'essaye d'enregistrer une clé étrangère dans la bdd:

erreur sq: Cannot add or update a child row: a foreign key constraint fails ('produits'.'produits', CONSTRAINT 'produits_ibfk_1' FOREIGN KEY ('categorie_id') REFERENCES 'categories' ('ID_categorie') ON DELETE CASCADE ON UPDATE CASCADE)
A voir également:

11 réponses

bissdebrazza Messages postés 2065 Date d'inscription   Statut Contributeur Dernière intervention   712
 
Bonjour!

Catégorie ( ID_catégorie (primaire), nom_categorie ) 

Produits ( ID_produit (primaire), nom produit, ID_categorie(clé étrangère) )
0
TRUNCKS Messages postés 1019 Date d'inscription   Statut Membre Dernière intervention   7
 
Merci, je viens de corriger mes tables mais j'ai toujours le problème:

En gros, je récupère une liste déroulante comme ceci:

p><select name="nom_categorie">   
        <?php while ($result = mysql_fetch_array($requete)) { 
  echo '<option value="'.$result['dossier'].'">'.$result['nom_categorie'].'</option>'; 
  }?></select></p> 


Et je récupère comme ça:

$nom_categorie = mysql_real_escape_string($_POST['nom_categorie']); 
  
 $requete_cat = "SELECT ID_categorie 
             FROM categories 
       WHERE ID_categorie = '$nom_categorie'"; 
  
 //exécution de la requête: 
 $categorie = mysql_query($requete_cat) or die( mysql_error()); 


Ensuite, j'enregistre l'id dans la base.
0
bissdebrazza Messages postés 2065 Date d'inscription   Statut Contributeur Dernière intervention   712
 
Salut!
voila ce que tu vas faire,tu vas dans phpmyadmin sur la table produit, tu supprime l'index qui est crée automatiquement avec la table catégorie. et tu recrée manuelement.ça devrait passer normalement. j'ai eu ce même souci lorsque je copier directement mes scripts sql généré avec powerAmc.
0
TRUNCKS Messages postés 1019 Date d'inscription   Statut Membre Dernière intervention   7
 
C'est bon, je suis arrivé a supprimer.

Comment fait on pour créer la clé étrangère avec une requête ?

Désolé je ne sais pas comment on fait :(
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
bissdebrazza Messages postés 2065 Date d'inscription   Statut Contributeur Dernière intervention   712
 
ok,tu te met sur la table produit (la structure), en bas tu veras un tableau "index", tu crée un nouvel index tout en choisissant la colonne concernée. une fois fait,juste en dessous du tableau de la structure de la table produit tu verras "Gestions des relations" tu clique la bas. et dans la page qui apparait, tu verras que tu peux selectionner l'ID de la catégorie. tu déroule le menu et tu choisi un truc de ce genre catégorie--->ID_categorie et tu prend la suppression en cascade et modification aussi.tu valide le tout et tout devrait aller mieux!
0
TRUNCKS Messages postés 1019 Date d'inscription   Statut Membre Dernière intervention   7
 
Rhaa mais c'est pas vrai, j'ai toujours ce p... de message.

erreur sq: Cannot add or update a child row: a foreign key constraint fails ('images'.'images', CONSTRAINT 'images_ibfk_2' FOREIGN KEY ('ID_image') REFERENCES 'images' ('categorie_id') ON DELETE CASCADE ON UPDATE CASCADE)

Bon sang j'suis nul ou quoi, ça doit pas être la folie de lier deux tables quoi lol
0
TRUNCKS Messages postés 1019 Date d'inscription   Statut Membre Dernière intervention   7
 
Quand je fais un echo de $categorie pour voir, il me sort:

id #6

Alors que l'id est censé être 1 :(
0
bissdebrazza Messages postés 2065 Date d'inscription   Statut Contributeur Dernière intervention   712
 
tes deux tables ont des enregistrements? car si ta table produit est vide, tu ne peux pas supprimer une catégorie car dans sa suppression il ne trouveras pas l'ID correspondant dans l'autre table.
0
TRUNCKS Messages postés 1019 Date d'inscription   Statut Membre Dernière intervention   7
 
J'arrive deja à insérer un enregistrement a partir de phpmyadmin.

J'ai bien la liste déroulante avec les catégories dans la clé étrangère, déja ça.

Je pense que le dernier soucis, c'est qu'il ne me renvoie pas la bonne ID non ?

Il me renvoie un 6 alors que je n'ai que 1, 12 et 13 en ID_catégorie.
0
bissdebrazza Messages postés 2065 Date d'inscription   Statut Contributeur Dernière intervention   712
 
regarde bien tes enregistrements
0
TRUNCKS Messages postés 1019 Date d'inscription   Statut Membre Dernière intervention   7
 
Tu crois que ma requête est fausse ?

Je cécupère le nom_catégorie à partir d'une liste déroulante, je demande l'ID est j'enresgistre.

J'ai manqué quelque chose ?

 $nom_categorie = mysql_real_escape_string($_POST['nom_categorie']); 
  
 $requete_cat = "SELECT ID_categorie 
 FROM categories 
 WHERE nom_categorie = '$nom_categorie'"; 
      
 //exécution de la requête: 
 $categorie = mysql_query($requete_cat) or die( mysql_error()); 


  $sq = "INSERT INTO images VALUES('','$titre_image','$titre_image2','$texte_image','$texte_image2','$nFile','$categorie')";  
  $quer = mysql_query($sq) or die('erreur sq: '.mysql_error()); 
0