Woofy
Pour les bons tuyaux me demander
Messages : 26 008 Inscrit le 11/01/02
Ville : Paris / Grenoble
Non connecté
|
|
Posté le 22 mai 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.
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 :
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 :
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
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
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
|
|
| |
Totalement inutile, donc completement indispensable 
|
bernie38
Waldorf (le pote à Statler)
Messages : 11 391 Inscrit le 28/08/03
Ville : Claix
Non connecté
|
|
Posté le 22 mai 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
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
Pour les bons tuyaux me demander
Messages : 26 008 Inscrit le 11/01/02
Ville : Paris / Grenoble
Non connecté
|
|
Posté le 22 mai 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 !
|
|
| |
Totalement inutile, donc completement indispensable 
|
bernie38
Waldorf (le pote à Statler)
Messages : 11 391 Inscrit le 28/08/03
Ville : Claix
Non connecté
|
|
Posté le 22 mai 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
Pour les bons tuyaux me demander
Messages : 26 008 Inscrit le 11/01/02
Ville : Paris / Grenoble
Non connecté
|
|
Posté le 22 mai 2006 - 18 h 28 m 05 s |
|
|
Bon, j'ai tenté de faire un
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 ?
|
|
| |
Totalement inutile, donc completement indispensable 
|
bernie38
Waldorf (le pote à Statler)
Messages : 11 391 Inscrit le 28/08/03
Ville : Claix
Non connecté
|
|
Posté le 22 mai 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
|
|
| |
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
Pour les bons tuyaux me demander
Messages : 26 008 Inscrit le 11/01/02
Ville : Paris / Grenoble
Non connecté
|
|
Posté le 22 mai 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.
|
|
| |
Totalement inutile, donc completement indispensable 
|
Woofy
Pour les bons tuyaux me demander
Messages : 26 008 Inscrit le 11/01/02
Ville : Paris / Grenoble
Non connecté
|
|
Posté le 22 mai 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 
|
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 !
|
|
| |
Totalement inutile, donc completement indispensable 
|
bernie38
Waldorf (le pote à Statler)
Messages : 11 391 Inscrit le 28/08/03
Ville : Claix
Non connecté
|
|
Posté le 22 mai 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 
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 mai 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
|
|