Version complète: sur le forum Webmaster Hub : InnoDB et foreign keys
Webmaster Hub > Création et exploitation de Sites Internet > Les langages du Net > SQL
mathieu147
Bonjour,

Je tente de créer les tables de ma base de données avec le script SQL suivant:
CODE
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:
CITATION
#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
CODE
  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.gif ).

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

Merci d'avance de m'aider smile.gif
petit-ourson
Et si tu ajoutes un index à "code_exemplaire" de ta table Exemplaire ??
mathieu147
CITATION(petit-ourson @ jeudi 3 mai 2007, 19h01) *
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:
CODE
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...
petit-ourson
CITATION(mathieu147 @ vendredi 4 mai 2007, 15h03) *
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)
Ceci est une version "bas débit" de notre forum. Pour voir la version complète avec plus d'information, la mise en page et les images, veuillez cliquer ici.