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

MySQL Discussion :

Clé étrangère qui fait référence à une clé Primaire & Étrangère à la fois ?


Sujet :

MySQL

  1. #1
    Inactif  
    Femme Profil pro
    Étudiant
    Inscrit en
    Août 2017
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2017
    Messages : 16
    Points : 12
    Points
    12
    Par défaut Clé étrangère qui fait référence à une clé Primaire & Étrangère à la fois ?
    Bonjour,

    Je me permet de poster un message car je ne trouve pas de solution à mon problème et je n'ai pas assez de connaissance en SQL pour le resoudre

    L'idée, j'ai 3 tables : (schématisé très simplement sous excel pour vous montrer)

    Nom : Capture.PNG
Affichages : 3174
Taille : 5,0 Ko

    Donc pour vous expliquer un peu : j'ai une clé étrangère 'user_id' dans la table Chantier_id qui fait donc référence à 'id' dans la table user. J'aimerai faire de cette clé étrangère également une clé primaire (normalement j'ai réussis à le faire sous phpMyAdmin).
    L'idée est qu'ensuite depuis ma table Zone, la colonne user_id soit une clé étrangère qui fait référence à chantier.user_id

    Je pense que cela est possible (enfin d'après ce que j'ai pu voir dans un forum)
    Mais lorsque j'essaye d'ajouter ma contrainte de clé étrangère à 'user_id' de la table zone, avec la commande suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    ALTER TABLE zone 
    ADD FOREIGN KEY (user_id) REFERENCES chantier (user_id);
    J'ai l'erreur suivante :
    MySQL a répondu:

    #1452 - Cannot add or update a child row: a foreign key constraint fails (`alpestopauscult`.`#sql-3a81_116f`, CONSTRAINT `#sql-3a81_116f_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `chantier` (`user_id`))
    Peut-etre une meilleure idée ?
    L'idée c'est en fait de récupérer l'id de l'utilisateur qui dépend du chantier depuis la table zone
    (J'affiche Zone, avec le nom du chantier de laquelle la zone dépend et ensuite j'aimerai afficher le nom de l'utilisateur qui dépend du chantier)

    Ex : ZoneA appartient au chantierY qui appartient au client1
    ZoneA ne peut pas appartenir au client2 car ChantierY n'appartient pas au client2
    (Je trouvais ca plutôt claire ^^)

    Merci de votre aide !!

  2. #2
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Je vais répondre à votre question mais ne vous précipitez pas pour mettre en oeuvre la solution...

    Dans votre schéma, Chantier.user_id n'est qu'une clé étrangère et pas un élément de la clé primaire. Il faudrait donc modifier la clé primaire pour y faire participer user_id.


    Maintenant, voyons les choses sémantiquement...

    D'après votre schéma, toujours, vous avez un seul user qui est associé à un chantier. Que cela signifie t-il ? Est-ce l'utilisateur qui a enregistré le chantier dans la base de données ? Est-ce le chef de chantier ? N'y a t-il qu'un seul ouvrier par chantier ?

    Ensuite, je crois comprendre que la zone est une zone dans un chantier. Quel intérêt y a t-il a associer de nouveau le user à la zone alors qu'on peut le trouver via le chantier ?
    Voulez-vous en fait enregistrer l'ouvrier qui travaille sur telle zone de tel chantier ? Alors votre modèle de données est faux.


    Bref, sans plus de précisions sur votre besoin, difficile de vous aider efficacement.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « 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 la suite Linux Mageïa !

  3. #3
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 768
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 768
    Points : 52 719
    Points
    52 719
    Billets dans le blog
    5
    Par défaut
    Une clef étrangère doit référencer une clef primaire ou unique. Dans votre cas vous tentez de référencer une colonne qui n'est ni PK ni UNIQUE. Cela ne peut pas marcher....

    Mais les messages de MySQmerde sont débiles....

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  4. #4
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 381
    Points : 19 065
    Points
    19 065
    Par défaut
    Salut Killkala.

    Citation Envoyé par Killkala
    J'aimerai faire de cette clé étrangère également une clé primaire (normalement j'ai réussis à le faire sous phpMyAdmin).
    Pour quelle raison désirez-vous faire cela ?

    Si j'essaye de comprendre que selon vous c'est faisable, cela signifie que pour un "user", il n'a qu'un et un seul "chantier".
    De ce fait, cette approche est absurde.

    Citation Envoyé par Killkala
    L'idée est qu'ensuite depuis ma table Zone, la colonne user_id soit une clé étrangère qui fait référence à chantier.user_id
    Si j'interpète bien ce que vous dites, vous désirez posséder comme identifiant de la table "Zone", une clef composite.
    Autrement dit, une clef composée de l'identifiant de la table "user" et de l'identifiant de la table "chantier" et de l'identifiant de la table "zone".
    Cette approche se faisait jadis quand on utilisait des fichiers séquentiels indexées.
    Vous êtes dans une base de données relationnelles et cette approche est obsolète !!!

    L'organisation de vous trois tables doit être de type hiérarchique. En terme mathématique, ce sont des inclusions.
    Donc votre "zone" est include dans "chantier" qui lui-même est inclue dans "user".

    Pour accéder à l'information contenue dans la table "user", à partir de la table "zone", vous devez faire deux jointures.
    L'une allant de "zone" --> "chantier", et l'autre allant de "chantier" --> "user".

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MySQL] Comment modifier un champ qui fait référence à une autre table ?
    Par geeka dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 04/08/2014, 12h51
  2. [XL-2003] Formule qui fait référence a une feuille ajouté
    Par dlight dans le forum Excel
    Réponses: 4
    Dernier message: 09/12/2009, 23h45
  3. [XL-2003] Adapter Formule qui fait référence à une cellule sur la même ligne
    Par toukii dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 05/06/2009, 00h25
  4. Réponses: 1
    Dernier message: 16/05/2008, 16h36
  5. Réponses: 6
    Dernier message: 16/07/2007, 17h11

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