Cle etrangère

Eléphanteau du PHP | 34 Messages

22 oct. 2009, 14:31

Bonjour,


donc je me emts à revoir totalement ma table.
Je vais la diviser en 2.

1) Une table membres
id_membres
nom
prenom

2) une table article
id_article
id_membres
titre
categories.

Je souhaite donc relier le id_membres ( de la table article) au id_membres (de la table membres).

Pour créer ma deuxième table, j'essaye ceci
CREATE TABLE `article` (
`id_article` int(11) NOT NULL AUTO_INCREMENT,
`id_membres` INT( 6 ) NOT NULL ,
`image` varchar(300) NOT NULL,
`titre` varchar(70) NOT NULL,
`auteur` varchar(70) NOT NULL,
PRIMARY KEY ( `id_article` ) ,
INDEX ( `id_article` ) ,
FOREIGN KEY ( `id_membres` ) REFERENCES `membres` ( `id_membres` )
) TYPE = InnoDB 
Il me met comme erreur:
#1005 - Ne peut créer la table 'base.article' (Errcode: 150) (<a href="server_engines.php?engine=InnoDB&page=Status&token=14a958bfd962f64400cd2fddbd836652">Détails...</a>)

Si j'enleve le innoDB, la requete passe. Mais est ce que ma clé étrangère sera pris en compte ?


Si oui, une petite question:
Je viens d'insèrer une personne robert machin dans la table membres.
Quelle requete je peux utiliser pour voir si ma clé étrangère fonctionne ?

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

22 oct. 2009, 15:09

Un problème à la fois : tu as cherché à quoi correspond le code erreur 150 ?

Peux-tu nous mettre la structure de la table membres stp.

ViPHP
fab
ViPHP | 2657 Messages

22 oct. 2009, 15:19

alors as tu vérifié qu'il existe bien un champ id_membres dans la table membres ? De plus il faut que les deux champs ( champ référence et clé étrangère ) soient EXACTEMENT au même format donc là le champ id_membre de ta table membre doit être en INT(6) aussi

Une fois que tu as fais tout ces vérifications si ton problème persiste, il faut savoir que InnoDB est plus exigeant sur l'ordre de création des tables SQL, dans le sens ou tu dois créér la table référence avant la table contenant la cléf étrangère mais ce problème est contournable

avant ta requete met

Code : Tout sélectionner

SET foreign_key_checks = 0;
et après

Code : Tout sélectionner

SET foreign_key_checks = 1;
Et oublies pas pour le coup de mettre un ; après ta requete pour dire qu'elle est terminée :)
Seul l'intelligent a le pouvoir de se trouver con
try { work(); } catch(FlemmeExeption $e) { sleep(84600); }

Eléphanteau du PHP | 34 Messages

22 oct. 2009, 16:40

Alors,

oui id_membres existe bien.
C'est le meme format INT (11).

J'ai crée d'abord la table membres.

Sinon quand j'enleve innodb, la requete fonctionne

Voila table membres:
CREATE TABLE IF NOT EXISTS `membres` (
  `id_membres` int(11) NOT NULL AUTO_INCREMENT,
  `nom` varchar(35) NOT NULL,
  `prenom` varchar(35) NOT NULL,
  PRIMARY KEY (`id_membres`),
  KEY `id` (`id_membres`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=14 ;

ViPHP
fab
ViPHP | 2657 Messages

22 oct. 2009, 17:00

Justement regarde dans ta table membres id_membres c'est en INT(11) alors que ta foreign key c'est un INT(6) donc certes ça reste des INT mais c'est pas exactement pareil :p
Seul l'intelligent a le pouvoir de se trouver con
try { work(); } catch(FlemmeExeption $e) { sleep(84600); }

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

22 oct. 2009, 17:01

C'est le meme format INT (11).
Bah non...
`id_membres` INT( 6 ) NOT NULL ,
le champ id_membre de ta table membre doit être en INT(6) aussi

Eléphanteau du PHP | 34 Messages

22 oct. 2009, 17:03

Ouep je viens de corriger mais toujours ca n'a pas réglé le probleme

ViPHP
fab
ViPHP | 2657 Messages

22 oct. 2009, 17:09

Hum je viens aussi de voir que ta table membres est en MyISAM faut la mettre en InnoDB !
Seul l'intelligent a le pouvoir de se trouver con
try { work(); } catch(FlemmeExeption $e) { sleep(84600); }

Eléphanteau du PHP | 34 Messages

22 oct. 2009, 17:17

Effectivement, quel con je suis :cry:

Merci.

J'ai donc souhaité dissocier ma table en 2 pour pouvoir à terme faciliter le count dans mes requetes.

J'ai un fichier ajout où les personnes peuvent ajouter des articles. C'est un simple formulaire avec ls champs suivants:
nom
prenom
titre
image
article

Et un bouton valider qui renvoie sur la page validation qui assure l'insertion dans ma table.

C'est possible en une requete d'insérer les données dans les deux tables (membres et articles) ou faudra t-il que j'ajoute d'abord chaque membre, que j'y donne son id et qu'ils l'indiquent dans un nouveau champ quand il ajoutera un article ?

ViPHP
fab
ViPHP | 2657 Messages

22 oct. 2009, 17:22

Tu peux faire des insertions que tables par tables désolé :)
Seul l'intelligent a le pouvoir de se trouver con
try { work(); } catch(FlemmeExeption $e) { sleep(84600); }

Eléphanteau du PHP | 34 Messages

22 oct. 2009, 17:58

ok merci beaucoucp

ViPHP
fab
ViPHP | 2657 Messages

22 oct. 2009, 18:04

Derien :) Bonne continuation et oublies pas de mettre le sujet en résolu :)
Seul l'intelligent a le pouvoir de se trouver con
try { work(); } catch(FlemmeExeption $e) { sleep(84600); }