IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

EDI, CMS, Outils, Scripts et API PHP Discussion :

Clé étrangère récalcitrante


Sujet :

EDI, CMS, Outils, Scripts et API PHP

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Recherche d'emploi
    Inscrit en
    Décembre 2014
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Recherche d'emploi

    Informations forums :
    Inscription : Décembre 2014
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Clé étrangère récalcitrante
    Bonjour, bonsoir,

    Tout premièrement, je m'excuse si ce message est dans la mauvaise section, mais l'ambiguïté d'utiliser les scripts SQL avec phpMyAdmin...

    Bien, avant le problème en lui-même, je vais vous donner le contexte.
    Dans le cadre d'un projet universitaire, je dois réaliser une application en ligne de gestion d'une partie d'un jeu de role.
    J'ai pour ça dans ma base de données, entre autres:
    -une table "royaume", qui stocke les royaumes créés
    -une table "auth_table", qui stocke les utilisateurs
    -une table "acces_royaume", qui stocke l'association des deux tables précédentes, indiquant quels utilisateurs ont accès à quels royaumes.

    Voici le code de création des tables en question.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    CREATE TABLE IF NOT EXISTS `auth_table` (
      `user_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
      `username` varchar(20) NOT NULL DEFAULT '',
      `password` varchar(32) NOT NULL DEFAULT '',
      PRIMARY KEY (`user_id`),
      UNIQUE KEY `username` (`username`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
     
    CREATE TABLE IF NOT EXISTS `royaume` (
      `idRoyaume` int(11) NOT NULL AUTO_INCREMENT,
      `idMj` int(11) NOT NULL,
      `adresseCarte` varchar(50) NOT NULL COMMENT 'Pour stocker l''adresse relative de l''image d''une carte, afin de se conformer à l''exigence de pouvoir changer de carte',
      `nomRoyaume` varchar(20) NOT NULL,
      `alignement` varchar(20) NOT NULL,
      `ddControle` int(11) NOT NULL,
      `taille` int(11) NOT NULL,
      `economie` int(11) NOT NULL,
      `loyaute` int(11) NOT NULL,
      `stabilite` int(11) NOT NULL,
      `corruption` int(11) NOT NULL,
      `criminalite` int(11) NOT NULL,
      `loi` int(11) NOT NULL,
      `folklore` int(11) NOT NULL,
      `productivite` int(11) NOT NULL,
      `societe` int(11) NOT NULL,
      `gloire` int(11) NOT NULL,
      `infamie` int(11) NOT NULL,
      `niveauPublicite` int(11) NOT NULL,
      `niveauTaxation` int(11) NOT NULL,
      `festivals` int(11) NOT NULL,
      `insatisfaction` int(11) NOT NULL,
      `consommation` int(11) NOT NULL,
      `pointsConstruction` int(11) NOT NULL,
      `tresorerie` int(11) NOT NULL,
      `idDirigeant` int(11) NOT NULL,
      `idDirigeantSecondaire` int(11) NOT NULL,
      `idConsort` int(11) NOT NULL,
      `idConseiller` int(11) NOT NULL,
      `idGeneral` int(11) NOT NULL,
      `idGrandDiplomate` int(11) NOT NULL,
      `idHeritier` int(11) NOT NULL,
      `idGrandPretre` int(11) NOT NULL,
      `idGrandErudit` int(11) NOT NULL,
      `idMarechal` int(11) NOT NULL,
      `idAgentOrdreRoyal` int(11) NOT NULL,
      `idChefServicesSecrets` int(11) NOT NULL,
      `idTresorier` int(11) NOT NULL,
      `idViceRoi` int(11) NOT NULL,
      `idGrandprotecteur` int(11) NOT NULL,
      PRIMARY KEY (`idRoyaume`),
      KEY `royaume_ibfk_1` (`idDirigeant`),
      KEY `royaume_ibfk_2` (`idDirigeantSecondaire`),
      KEY `royaume_ibfk_3` (`idConsort`),
      KEY `royaume_ibfk_4` (`idConseiller`),
      KEY `royaume_ibfk_5` (`idGeneral`),
      KEY `royaume_ibfk_6` (`idGrandDiplomate`),
      KEY `royaume_ibfk_7` (`idHeritier`),
      KEY `royaume_ibfk_8` (`idGrandPretre`),
      KEY `royaume_ibfk_9` (`idGrandErudit`),
      KEY `royaume_ibfk_10` (`idMarechal`),
      KEY `royaume_ibfk_11` (`idAgentOrdreRoyal`),
      KEY `royaume_ibfk_12` (`idChefServicesSecrets`),
      KEY `royaume_ibfk_13` (`idTresorier`),
      KEY `royaume_ibfk_14` (`idViceRoi`),
      KEY `royaume_ibfk_15` (`idGrandprotecteur`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
     
    CREATE TABLE IF NOT EXISTS `acces_royaume` (
      `idAcces` int(11) NOT NULL AUTO_INCREMENT,
      `user_id` int(11) NOT NULL,
      `idRoyaume` int(11) NOT NULL,
      PRIMARY KEY (`idAcces`),
      KEY `fk_acces_royaume` (`idRoyaume`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
    Mon problème est le suivant.

    Après avoir réussi à définir la clé étrangère entre la table "acces_royaume" et "royaume" sur l'attribut "idRoyaume",
    il m'est impossible de faire de même entre "acces_royaume" et "auth_table" sur "user_id".
    Le code de la requête que je tente:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ALTER TABLE acces_royaume
    ADD CONSTRAINT fk_acces_user
    FOREIGN KEY(user_id)
    REFERENCES auth_table(user_id);
    Le code d'erreur obtenu: #1215 - Cannot add foreign key constraint

    Si l'un d'entre vous pourrait venir éclaircir ma lanterne, je lui en serait infiniment reconnaissant, cela fait un moment que je penche dessus, et je n'ai trouvé de réponse nulle part.

  2. #2
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2014
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2014
    Messages : 219
    Points : 336
    Points
    336
    Par défaut
    Bonjour

    Essaie de préciser à quelle table appartient quel user_id dans la 2ème requête peut-etre.

    Sinon lance un SHOW ENGINE INNODB STATUS et regarde LATEST FOREIGN KEY ERROR, cela t'éclaireras surement.

    Vérifie aussi que tes clés étrangères sont bien indexées.

    Cordialement
    Si débugger est l'art de corriger les bugs, alors programmer est l'art d'en créer.

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Recherche d'emploi
    Inscrit en
    Décembre 2014
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Recherche d'emploi

    Informations forums :
    Inscription : Décembre 2014
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Bonjour,

    Je m'excuse du temps de réponse, mais j'ai eu quelques soucis me forçant à m'éloigner de l'ordinateur pendant un moment.
    Premièrement, merci de votre réponse.
    Ayant depuis mon premier message hébergé ma base de donnée, qui était alors en local, sur un serveur Olympe, j'ai ré-essayé la ligne de code qui ne passe pas, afin de pouvoir, avec le SHOW ENGINE INNODB STATUS, avoir une idée de ce qui se passe, seulement, j'ai deux problèmes qui se posent maintenant:

    Requête SQL :

    ALTER TABLE acces_royaume
    ADD CONSTRAINT fk_acces_user
    FOREIGN KEY(user_id)
    REFERENCES auth_table(user_id)

    MySQL a répondu:
    #1005 - Can't create table 'zo2agryp.#sql-55c_1408a78' (errno: 150)

    Notez que le message d'erreur a changé.

    Requête SQL :

    SHOW ENGINE INNODB STATUS

    MySQL a répondu:
    #1227 - Access denied; you need (at least one of) the PROCESS privilege(s) for this operation

    Je tiens à préciser que lors de la mise sur l'hébergeur de la base de donnée, ma tentative d'ajout de clé étrangère levait toujours le même problème.

Discussions similaires

  1. Réponses: 3
    Dernier message: 12/11/2003, 15h57
  2. [EJB2.1 Entity] [BES] Mapping automatique et clés étrangères
    Par Bobby McGee dans le forum Java EE
    Réponses: 3
    Dernier message: 15/10/2003, 10h33
  3. [clé primaire et étrangère]
    Par viny dans le forum Requêtes
    Réponses: 9
    Dernier message: 05/08/2003, 18h23
  4. clé primaire composée de 2 clés étrangères
    Par Tigresse dans le forum Installation
    Réponses: 5
    Dernier message: 28/07/2003, 14h38
  5. [Script]prob de clés étrangères
    Par Seb7 dans le forum Langage SQL
    Réponses: 13
    Dernier message: 08/07/2003, 17h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo