France Hardware : Forums de discussion - Découvrez notre nouveau comparateur d'offres Internet
Retrouvez les prix près de chez vous :  
Index du forum | Liste des membres | Liste des groupes | Inscription | F-A-Q | Recherche
Pseudo :    Password :     
29 511 membres enregistrés - 2 069 318 posts - 122 026 topics
Index des forums FH  | Index des forums DegroupNews
      Programmation
           Bases de données
                [MySQL] Problème de foreign key
53 connectés(record : 2799 le 29 May 2016 - 15 h 34)

Vous devez vous connecter pour répondre au topic.
[MySQL] Problème de foreign key

Woofy
Totalement inutile, complètement indispensable

Messages : 31 539
Inscrit le 11/01/02
Ville : Lyon
Non connecté
  Posté le 22 May 2006 - 17 h 46 m 06 s
Bon, j'ai créé une base de donnée MySQL, avec 17 tables InnoDB et des Foreign key de partout.
Et je suis en train de faire un script pour importer les données de l'ancienne table vers la nouvelle.
Seulement voila, je tatonne un peu avec les foreign key apparement, parcque mon script merde très vite!

Il me sort cette erreur :

1.2 - INSERT INTO `membres` (`Login`, `Password`, `Date`, `ID_Joueur`, `Droits`, `ID_Skin`) VALUES ('Woofy', '40a3efddab2666e1c272a37828827e75', '2006-04-01 11:30:50', '1', 'admin', '') :
Cannot add or update a child row: a foreign key constraint fails


Le bout de code de la page. La variable $id_alliance_avalon est correcte.
    Code     
 1. // Transposage de la table Membres
 2. $query1 = "SELECT * FROM `membre`";
 3. $result1 = mysql_query($query1, $db_old) or die("1 - $query1 : <br/>" . mysql_error($db_old));
 4. $nb_query++;
 5. while ($line1 = mysql_fetch_array($result1))
 6. {
 7. 	// Création du joueur relié au membre pour obtenir son ID
 8. 	$query11 = "INSERT INTO `joueurs` (`ID`, `Nom`, `ID_Alliance`)
 9. 			   VALUES ('', '".$line1['login']."', '$id_alliance_avalon')";
10. 	mysql_query($query11, $db_new) or die("1.1 - $query11 : <br/>" . mysql_error($db_new));
11. 	$nb_query++;
12. 	$id_joueur = mysql_insert_id($db_new);
13. 	
14. 	//Création du membre, relié au joueur dans la table joueurs et a l'alliance Avalon dans la table Alliance
15. 	$query12 = "INSERT INTO `membres` (`Login`, `Password`, `Date`, `ID_Joueur`, `Droits`, `ID_Skin`)
16. 			   VALUES ('".$line1['login']."', '".$line1['password']."', '".$line1['last_connexion']."', '$id_joueur', '".$line1['type']."', '')";
17. 	mysql_query($query12, $db_new) or die("1.2 - $query12 : <br/>" . mysql_error($db_new));
18. 	$nb_query++;
19. }
Et le code des 4 tables impliquées : Ancienne base de donnée :
    Code     
1. CREATE TABLE `membre` (
2.   `login` varchar(25) NOT NULL default '',
3.   `password` varchar(32) NOT NULL default '',
4.   `last_connexion` datetime NOT NULL default '0000-00-00 00:00:00',
5.   `alliance` varchar(50) default NULL,
6.   `type` enum('admin','membre','inscrit') NOT NULL default 'membre',
7.   PRIMARY KEY  (`login`)
8. ) ENGINE=MyISAM DEFAULT CHARSET=latin1
Nouvelle base de donnée :
    Code     
 1. CREATE TABLE `membres` (
 2.   `Login` varchar(25) NOT NULL default '',
 3.   `Password` varchar(64) NOT NULL default '',
 4.   `Date` datetime default NULL,
 5.   `ID_Joueur` int(10) unsigned default NULL,
 6.   `Droits` varchar(25) default NULL,
 7.   `ID_Skin` int(10) unsigned default NULL,
 8.   PRIMARY KEY  (`Login`),
 9.   KEY `Joueur` (`ID_Joueur`),
10.   KEY `Nom_Droits` (`Droits`),
11.   KEY `Skin` (`ID_Skin`),
12.   CONSTRAINT `Joueur` FOREIGN KEY (`ID_Joueur`) REFERENCES `joueurs` (`ID`) ON DELETE SET NULL ON UPDATE CASCADE,
13.   CONSTRAINT `Nom_Droits` FOREIGN KEY (`Droits`) REFERENCES `droits` (`Nom`) ON DELETE SET NULL ON UPDATE CASCADE,
14.   CONSTRAINT `Skin` FOREIGN KEY (`ID_Skin`) REFERENCES `skins` (`ID`) ON DELETE SET NULL ON UPDATE CASCADE
15. ) ENGINE=InnoDB DEFAULT CHARSET=latin1
    Code     
1. CREATE TABLE `joueurs` (
2.   `ID` int(10) unsigned NOT NULL auto_increment,
3.   `Nom` varchar(25) NOT NULL default '',
4.   `ID_Alliance` int(10) unsigned default NULL,
5.   PRIMARY KEY  (`ID`),
6.   KEY `ID_Alliance` (`ID_Alliance`),
7.   CONSTRAINT `Alliance` FOREIGN KEY (`ID_Alliance`) REFERENCES `alliances` (`ID`) ON DELETE SET NULL ON UPDATE CASCADE
8. ) ENGINE=InnoDB DEFAULT CHARSET=latin1
    Code     
1. CREATE TABLE `alliances` (
2.   `ID` int(10) unsigned NOT NULL auto_increment,
3.   `Nom` varchar(25) NOT NULL default '',
4.   `Tag` varchar(10) default NULL,
5.   PRIMARY KEY  (`ID`)
6. ) ENGINE=InnoDB DEFAULT CHARSET=latin1




bernie38
Waldorf (le pote à Statler)

Messages : 11 452
Inscrit le 28/08/03
Ville : Claix
Non connecté
  Posté le 22 May 2006 - 18 h 05 m 47 s


Cannot add or update a child row: a foreign key constraint fails

on dirait bien que tu essaies d'insérer une ligne avec une FK et qu'il n'y a pas de PK dans la table correspondante :pasmoi:

Et en désactivant les contraintes, le temps de faire le load ? Ou de charger les données dans le bon ordre ?



La Montagne n'est pas dangereuse : on ne peut qu'y perdre la vie, tandis qu'en ville on devient bête et méchant
Voltaire


Woofy
Totalement inutile, complètement indispensable

Messages : 31 539
Inscrit le 11/01/02
Ville : Lyon
Non connecté
  Posté le 22 May 2006 - 18 h 11 m 25 s
J'ai vu ça, mais bon je veux essayer de ne pas faire porc.
Sinon, il y a bien une PK, égale a 1, dans la table joueurs.
Ce qui est marrant, c'est qu'il ne m'a pas posé de problème pour l'insertion dans la table joueur, qui fait référence a la table alliance. Je vois pas ce qui diffère ! :dsl:




bernie38
Waldorf (le pote à Statler)

Messages : 11 452
Inscrit le 28/08/03
Ville : Claix
Non connecté
  Posté le 22 May 2006 - 18 h 27 m 11 s


CREATE TABLE `joueurs` (
`ID` int(10) unsigned NOT NULL auto_increment,
`Nom` varchar(25) NOT NULL default '',
`ID_Alliance` int(10) unsigned default NULL,
PRIMARY KEY (`ID`),
KEY `ID_Alliance` (`ID_Alliance`),
CONSTRAINT `Alliance` FOREIGN KEY (`ID_Alliance`) REFERENCES `alliances` (`ID`) ON DELETE SET NULL ON UPDATE CASCADE
8. ) ENGINE=InnoDB DEFAULT CHARSET=latin1


et dans alliance, je vois pas de PK qui s'appelle ID_Alliance, mais ID...


CREATE TABLE `alliances` (
`ID` int(10) unsigned NOT NULL auto_increment,
`Nom` varchar(25) NOT NULL default '',
`Tag` varchar(10) default NULL,
PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1

Encore que je connais pas du tout MySQL, je connais Oracle, y'a peut être des subtilités dans le nommage que je connais pas ?



La Montagne n'est pas dangereuse : on ne peut qu'y perdre la vie, tandis qu'en ville on devient bête et méchant
Voltaire


Woofy
Totalement inutile, complètement indispensable

Messages : 31 539
Inscrit le 11/01/02
Ville : Lyon
Non connecté
  Posté le 22 May 2006 - 18 h 28 m 05 s
Bon, j'ai tenté de faire un
    Code     
1. $prequery = "SET FOREIGN_KEY_CHECKS = 0";
2. mysql_query($pre_query, $db_new) or die ("PRE - $prequery:<br/>".mysql_error($db_new));

au début, mais ca n'a rien donné :


PRE - SET FOREIGN_KEY_CHECKS = 0:
Query was empty


Il faut utiliser autre chose que mysql_query ?




bernie38
Waldorf (le pote à Statler)

Messages : 11 452
Inscrit le 28/08/03
Ville : Claix
Non connecté
  Posté le 22 May 2006 - 18 h 29 m 37 s
d'autre part, en tout cas en relationnel, un attribut doit avoir le même nom où qu'il se trouve. De même, au moins en Oracle, une PK et la/les FK correspondante(s) doivent avoir le même nommage.

Disons qu'en plus, ça aide :chepa:



La Montagne n'est pas dangereuse : on ne peut qu'y perdre la vie, tandis qu'en ville on devient bête et méchant
Voltaire


Woofy
Totalement inutile, complètement indispensable

Messages : 31 539
Inscrit le 11/01/02
Ville : Lyon
Non connecté
  Posté le 22 May 2006 - 18 h 30 m 27 s


Le 22 mai 2006 - 18 h 27, bernie38 a écrit :


CREATE TABLE `joueurs` (
`ID` int(10) unsigned NOT NULL auto_increment,
`Nom` varchar(25) NOT NULL default '',
`ID_Alliance` int(10) unsigned default NULL,
PRIMARY KEY (`ID`),
KEY `ID_Alliance` (`ID_Alliance`),
CONSTRAINT `Alliance` FOREIGN KEY (`ID_Alliance`) REFERENCES `alliances` (`ID`) ON DELETE SET NULL ON UPDATE CASCADE
8. ) ENGINE=InnoDB DEFAULT CHARSET=latin1


et dans alliance, je vois pas de PK qui s'appelle ID_Alliance, mais ID...


CREATE TABLE `alliances` (
`ID` int(10) unsigned NOT NULL auto_increment,
`Nom` varchar(25) NOT NULL default '',
`Tag` varchar(10) default NULL,
PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1

Encore que je connais pas du tout MySQL, je connais Oracle, y'a peut être des subtilités dans le nommage que je connais pas ?



J'ai un peu abandonné Oracle l'année dernière donc je sais pas.
Pour le cas que tu montre, ca veut dire que la FOREIGN KEY est ID_Alliance et s'applique sur le champ ID de la table alliances. Tu a oublié de mettre en gras un peu plus loin.

De plus, j'ai créé toute la base avec Navicat et phpMyAdmin, donc pas de problème de création je pense, a la rigueur de conception.




Woofy
Totalement inutile, complètement indispensable

Messages : 31 539
Inscrit le 11/01/02
Ville : Lyon
Non connecté
  Posté le 22 May 2006 - 18 h 31 m 33 s


Le 22 mai 2006 - 18 h 29, bernie38 a écrit :
d'autre part, en tout cas en relationnel, un attribut doit avoir le même nom où qu'il se trouve. De même, au moins en Oracle, une PK et la/les FK correspondante(s) doivent avoir le même nommage.

Disons qu'en plus, ça aide :chepa:

Sauf que j'ai une table qui a 6 FK qui pointent sur 2 tables, ca ferait beaucoup de champs ID qu'on ne sais pas d'où ca viens !




bernie38
Waldorf (le pote à Statler)

Messages : 11 452
Inscrit le 28/08/03
Ville : Claix
Non connecté
  Posté le 22 May 2006 - 18 h 33 m 59 s
et ID, c'est, tu crois, un identifiant de colonne bien vu par tout ce qui est relationnel ? ça veut rien dire et tout dire. On mettait ça dans des pgms assembleurs il y a 25 ans :roll:
Le nommage, merde, c'est pas juste pour faire joli !

EDIT : et en plus, un nom de colonne comme ID, c'est super bien vu par un pauv' bougre qui va devoir faire de la maintenance sur un produit qui a quelques milliers de lignes de code, avec un schéma de 500 tables et 10000 colonnes. Tu vois où je veux en venir ou bien ?


Message édité 1 fois, la dernière par bernie38 le 22 May 2006 - 18 h 35.

La Montagne n'est pas dangereuse : on ne peut qu'y perdre la vie, tandis qu'en ville on devient bête et méchant
Voltaire


Page genérée en 0.2621 secondes par RahForum 2.0 | Gzip off |  Stats |  Metaforums |  RSS
© 2004 Cerbere Systems.
Prix Matériel Informatique | Informatique Lyon | Informatique Grenoble | Informatique Annecy | Informatique Marseille | Informatique Bordeaux | Forum Informatique
ADSL | Actualité ADSL | Deligo | Appareil photo | Commande Au Volant
Creative Commons
Message Boards and Forums Directory