Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Requêtes
Requêtes Forum d'entraide sur les requêtes MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 01/08/2011, 16h20   #1
Invité régulier
 
Homme
Développeur Web
Inscription : janvier 2009
Messages : 20
Détails du profil
Informations personnelles :
Sexe : Homme

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : janvier 2009
Messages : 20
Points : 6
Points : 6
Par défaut Foreign Key : Error Code: 1005 Can't create table 'bdd.tabletoto' (errno: 150)

Bonjour à tous,

Cela fait deux jours que je suis sur le même problème de création de clé étrangère et là je n'en peux plus. Je m'explique :

Sur la base de données "bdd":

J'ai une table de type INNODB charset UTF-8, appelée admettons "titi"
-----------------

Identifiant varchar(100) PK NOT NULL
Colonne1 varchar(45)
Colonne2 int
...

Je crée maintenant ma table bdd.toto :

Code :
1
2
3
4
5
6
7
8
9
10
CREATE  TABLE `bdd`.`toto` (
  `id` INT NOT NULL ,
  `Identifiant` VARCHAR(100) NOT NULL ,
  [...]
  PRIMARY KEY (`id`) ,
  CONSTRAINT `FK_Identifiant_titi`
    FOREIGN KEY (`Identifiant`)
    REFERENCES `bdd`.`titi` (`Identifiant`)
    ON DELETE CASCADE
    ON UPDATE CASCADE);
Voici le message (très explicite) retourné par MySql :

Citation:
Error Code: 1005
Can't create table 'bdd.toto' (errno: 150)
J'ai essayé de créer la clé avec l'éditeur de requêtes de MySql WorkBench, j'ai essayé de d'abord créer la table, puis ensuite ajouter la contrainte, mais c'est à chaque fois le même résultat...

Je ne sais plus quoi faire.

Merci d'avance de vos réponses
niusha est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/08/2011, 18h26   #2
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 009
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 009
Points : 18 282
Points : 18 282
Envoyer un message via MSN à CinePhil
Bien entendu, tu as essayé ça en ayant au préalable créé la table titi avec l'identifiant de cette table en clé primaire ?
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/08/2011, 21h52   #3
Invité régulier
 
Homme
Développeur Web
Inscription : janvier 2009
Messages : 20
Détails du profil
Informations personnelles :
Sexe : Homme

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : janvier 2009
Messages : 20
Points : 6
Points : 6
Citation:
Envoyé par CinePhil Voir le message
Bien entendu, tu as essayé ça en ayant au préalable créé la table titi avec l'identifiant de cette table en clé primaire ?
Oui, la colonne "Identifiant" (Varchar(100)) est la clé primaire de la table titi.
niusha est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/08/2011, 21h57   #4
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 009
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 009
Points : 18 282
Points : 18 282
Envoyer un message via MSN à CinePhil
En dehors du fait qu'un VARCHAR(100) comme clé primaire est un mauvais choix, tu peux donner le script de création de la table titi (résultat de SHOW CREATE TABLE titi) ?

Il faudrait aussi que la colonne portant la clé étrangère soit indexée.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/08/2011, 11h46   #5
Invité régulier
 
Homme
Développeur Web
Inscription : janvier 2009
Messages : 20
Détails du profil
Informations personnelles :
Sexe : Homme

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : janvier 2009
Messages : 20
Points : 6
Points : 6
Citation:
Envoyé par CinePhil Voir le message
En dehors du fait qu'un VARCHAR(100) comme clé primaire est un mauvais choix, tu peux donner le script de création de la table titi (résultat de SHOW CREATE TABLE titi) ?

Il faudrait aussi que la colonne portant la clé étrangère soit indexée.
Bonjour CinePhil et merci de prendre le temps de m'aider

Le choix d'utiliser un VARCHAR(100) est indépendant de ma volonté, il doit probablement être capable de recevoir des chiffres ainsi que des lettres.

Voici ensuite le script de création de la table titi :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
CREATE TABLE `titi` (
  `NomPrenom` varchar(100) CHARACTER SET latin1 NOT NULL,
  [...]
  `Identifiant` varchar(100) CHARACTER SET latin1 NOT NULL,
  [...]
  `ScoringGlobal` varchar(45) CHARACTER SET latin1 DEFAULT NULL,
  [...]
  `ScoringENV` varchar(45) CHARACTER SET latin1 DEFAULT NULL,
  DEFAULT NULL,
  `Version` varchar(45) CHARACTER SET latin1 DEFAULT NULL,
  PRIMARY KEY (`Identifiant`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
Grâce à cette commande, j'ai pu voir que ma colonne Identifiant est encore en charset latin1.

Cela veux dire que la commande


Code :
ALTER TABLE `bdd`.`titi` COLLATE = XXX, ENGINE = YYY;
Générée par MySql WorkBench lors de la modification du charset et du moteur ne modifie pas le charset des colonnes déjà créées, mais le charset par défaut de la table.

J'effectue donc :

Code :
ALTER TABLE `bdd`.`titi` CHANGE COLUMN `Identifiant` `Identifiant` VARCHAR(100) CHARACTER SET 'utf8' NOT NULL  ;
Puis je réessaye :

Code :
1
2
3
4
5
6
7
8
9
10
11
CREATE  TABLE `bdd`.`toto` (
  `id` INT NOT NULL ,
  `Identifiant` VARCHAR(100) NOT NULL ,
  PRIMARY KEY (`id`) ,
  CONSTRAINT `FK_Identifiant_bdd`
    FOREIGN KEY (`Identifiant`)
    REFERENCES `bdd`.`titi` (`Identifiant`)
    ON DELETE CASCADE
    ON UPDATE CASCADE)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8;
Et ça marche !

Merci de ton aide !
niusha est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/08/2011, 12h00   #6
ced
Rédacteur/Modérateur

 
Avatar de ced
 
Homme Cédric Duprez
Inscription : avril 2002
Messages : 3 823
Détails du profil
Informations personnelles :
Nom : Homme Cédric Duprez
Âge : 36
Localisation : France, Loiret (Centre)

Informations professionnelles :
Secteur : Agroalimentaire - Agriculture

Informations forums :
Inscription : avril 2002
Messages : 3 823
Points : 6 437
Points : 6 437
Et donc ? Le problème est ?
__________________
Rédacteur / Modérateur SGBD
Mes tutoriels et la FAQ MySQL

----------------------------------------------------
Pensez aux balises code et au tag
Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça
ced est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/08/2011, 13h12   #7
Invité régulier
 
Homme
Développeur Web
Inscription : janvier 2009
Messages : 20
Détails du profil
Informations personnelles :
Sexe : Homme

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : janvier 2009
Messages : 20
Points : 6
Points : 6
Citation:
Envoyé par ced Voir le message
Et donc ? Le problème est ?
Oui, j'ai oublié de cliquer ! Merci !
niusha est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 10h01.


 
 
 
 
Partenaires

Hébergement Web