Sql clé étrangère phpMyAdmin

Fermé
novas91000 Messages postés 21 Date d'inscription lundi 11 octobre 2010 Statut Membre Dernière intervention 9 mai 2011 - 4 déc. 2010 à 23:32
novas91000 Messages postés 21 Date d'inscription lundi 11 octobre 2010 Statut Membre Dernière intervention 9 mai 2011 - 5 déc. 2010 à 00:24
Bonjour,

voici mon problème :

J'ai deux tables

CREATE TABLE membres(
idMembre INT auto_increment,
nom VARCHAR(50),
prenom VARCHAR(50),
dateNaiss DATE,
lieuNaiss VARCHAR(100),
mdp VARCHAR(150),
PRIMARY KEY (idMembre))

CREATE TABLE images(
idImage INT auto_increment,
nom VARCHAR(50),
extension CHAR(3),
idMembre INT auto_increment,
PRIMARY KEY (idImage),
FOREIGN KEY (idMembre) REFERENCES membres (idMembre))

Je suis sur phpMyAdmin via WAMP,

quand je valide l'entrée du code SQL pour la TABLE images
il me dit que je ne peut utiliser qu'une seule ligne auto_incrémenté et que cette ligne doit être une clé.

Je suis perdu là !

Si j'en crois le méthode MERISE, on a une dépendance fonctionnelle entre membres et images car un membre peut avoir 0,n images mais une image ne peut avoir qu'un seule membres donc idmembre en clé étrangère dans la TABLE images.

Merci de vos futurs réponses.
A voir également:

1 réponse

Salut,
Attention à ne pas confondre identifiant naturel dans merise et clé primaire dans les tables.
Une clé étrangère n'est pas la clé primaire. Identifiant naturel ne signifies pas clé primaire sauf lorsque celui ci est unique. Il ne peut avoir qu'une seule clé primaire et par commodité on rajoutes le champ numérique idmembre qui ne correspond à aucune donnée du Dictionnaire de données Merise. Il y a des pour et des contre mais dans le cas de la table membre ça évite de faire le tri sur les 3 identifiants naturels de la table (nom+prénom+date de naissance car deux personnes de même nom et prénom est courant, moins probable qu'ils soient nés exactement le même jour).
Bref en considérant la table Image:
idMembre INT auto_increment

idMembre ne peut être auto_increment puisqu'il doit obligatoirement correspondre à idMembre de la table Membre. Généralement il est plus pratique de les nommer différemment parce qu'ils font référence à la même donnée mais dans des tables différente afin de ne pas les confondre; par exemple refMembre dans table image.
Ce champs dans la table image fait la liaison entre les deux tables(on parles aussi de jointures de tables), donc lorsque on cherche les images du membre dont l'idmembre sur la table membre est 3 il suffiras de chercher
WHERE refmembre.IMAGE=idmembre.MEMBRE (donc où l'id de la table membre apparaît dans la table image).
Il NE PEUT PAS ÊTRE AUTO-INCREMENTE, l'auto incrément rajoute 1 à chaque enregistrement, pour tout enregistrement de la table image il faut récupérer avant l'idmembre de la table membre afin de l'insérer dans la table image.

Inversement l'identifiant de la table image permet de retrouver le nom et prénom du membre donc surtout pas auto-incrémenté.

edit: l'erreur vient du fait que tu utilises le MCD pour les tables, hors celles ci sont faites par le MLD.
0
novas91000 Messages postés 21 Date d'inscription lundi 11 octobre 2010 Statut Membre Dernière intervention 9 mai 2011
5 déc. 2010 à 00:24
Heu ..., tu me dit que idMembre ne doit pas être auto_incrémenté mais idMembre est propore à un membre et au niveau relationnelle ça donne :

membres(idMembre, nom, prenom, dateNaiss, lieuNaiss, motDePasse)
idMembre : clé primaire

images(idImage, nom, extension, idMembre)
idImage : clé primaire
idMembre : clé étrangère en référence à idMembre de membres

et idMembre dans images est clé étrangère car elle existe dans une autre table et elle fait le lien avec idMembre de membres car une image n'appartient qu'à un seul membre !

je n'ai pas très bien compris ta logique là ^^
0