Aller au contenu

InnoDB et foreign keys


mathieu147

Sujets conseillés

Bonjour,

Je tente de créer les tables de ma base de données avec le script SQL suivant:

CREATE TABLE Personne(
code_personne INT NOT NULL PRIMARY KEY,
nom VARCHAR(50) NOT NULL,
prenom VARCHAR(50) NOT NULL
) TYPE=InnoDB;

CREATE TABLE Membre(
code_personne INT NOT NULL PRIMARY KEY,
adresse VARCHAR(100) NOT NULL,
date_inscription DATE NOT NULL,
INDEX(code_personne),
FOREIGN KEY(code_personne) REFERENCES Personne(code_personne)
) TYPE=InnoDB;

CREATE TABLE Film(
code_film INT NOT NULL PRIMARY KEY,
titre VARCHAR(50) NOT NULL,
annee SMALLINT(6) NOT NULL,
genre VARCHAR(25) NOT NULL,
evaluation TINYINT(4) NOT NULL,
code_personne INT NOT NULL,
INDEX(code_personne),
FOREIGN KEY(code_personne)
REFERENCES Personne(code_personne)
) TYPE=InnoDB;

CREATE TABLE Joue_dans(
code_personne INT NOT NULL,
code_film INT NOT NULL,
PRIMARY KEY(code_personne, code_film),
INDEX(code_personne, code_film),
FOREIGN KEY(code_personne) REFERENCES Personne(code_personne),
FOREIGN KEY(code_film) REFERENCES Film(code_film)
) TYPE=InnoDB;

CREATE TABLE Media(
code_media INT NOT NULL PRIMARY KEY,
type VARCHAR(5) NOT NULL
) TYPE=InnoDB;

CREATE TABLE Localisation(
code_localisation INT NOT NULL PRIMARY KEY,
description VARCHAR(50) NOT NULL
) TYPE=InnoDB;

CREATE TABLE Exemplaire(
code_film INT NOT NULL,
code_exemplaire INT NOT NULL,
code_media INT NOT NULL,
code_localisation INT NOT NULL,
PRIMARY KEY(code_film, code_exemplaire),
INDEX(code_film, code_media, code_localisation),
FOREIGN KEY(code_film)
REFERENCES Film(code_film),
FOREIGN KEY(code_media)
REFERENCES Media(code_media),
FOREIGN KEY(code_localisation)
REFERENCES Localisation(code_localisation)
) TYPE=InnoDB;

CREATE TABLE Emprunt(
code_personne INT NOT NULL,
code_film INT NOT NULL,
code_exemplaire INT NOT NULL,
date_emprunt DATE NOT NULL,
date_restitution DATE,
PRIMARY KEY(code_personne, code_film, code_exemplaire, date_emprunt),
INDEX(code_personne, code_film, code_exemplaire),
FOREIGN KEY(code_personne)
REFERENCES Membre(code_personne),
FOREIGN KEY(code_film)
REFERENCES Film(code_film),
FOREIGN KEY(code_exemplaire)
REFERENCES Exemplaire(code_exemplaire)
) TYPE=InnoDB;

Toutes les tables se créent correctement sauf la dernière (Emprunt). J'ai l'erreur suivante:

#1005 - Can't create table './travail2/Emprunt.frm' (errno: 150)

C'est la dernière clé étrangère (code_exemplaire) qui pose problème, parce que si je retire les lignes

  FOREIGN KEY(code_exemplaire)
REFERENCES Exemplaire(code_exemplaire)

ça ne me met plus d'erreur (mais évidemment, j'ai perdu ma contrainte aussi, ce qui est ennuyeux :nonono: ).

Ça fait des heures que je cherche et que j'épluche la documentation de mySQL et les forums, mais je ne trouve pas. :mad2:

Merci d'avance de m'aider :)

Modifié par mathieu147
Lien vers le commentaire
Partager sur d’autres sites

Et si tu ajoutes un index à "code_exemplaire" de ta table Exemplaire ??

Et bien si je fais ça, ça me fait exactement la même erreur. Dans un sens, c'est logique: je n'ai pas d'index sur code_media dans ma table Media, et pourtant ma clé étrangère vers Media(code_media) est correcte dans ma table Exemplaire.

Par contre, si je crée mes clés étrangères de cette façon:

CREATE TABLE Emprunt(
code_personne INT NOT NULL REFERENCES Membre(code_personne),
code_film INT NOT NULL REFERENCES Film(code_film),
code_exemplaire INT NOT NULL REFERENCES Exemplaire(code_exemplaire),
date_emprunt DATE NOT NULL,
date_restitution DATE,
INDEX(code_personne, code_film, code_exemplaire),
PRIMARY KEY(code_personne, code_film, code_exemplaire, date_emprunt)
) TYPE=InnoDB;

ça marche!

Mais je ne comprends pas pourquoi ça ne fonctionne pas de la première manière...

Lien vers le commentaire
Partager sur d’autres sites

Et bien si je fais ça, ça me fait exactement la même erreur. Dans un sens, c'est logique: je n'ai pas d'index sur code_media dans ma table Media, et pourtant ma clé étrangère vers Media(code_media) est correcte dans ma table Exemplaire.

Tu n'avais pas d'index mais une clef primaire. ;o)

Lien vers le commentaire
Partager sur d’autres sites

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...