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

Outils MySQL Discussion :

PRIMARY KEY et FOREIGN KEY sur la même colonne ?


Sujet :

Outils MySQL

  1. #1
    Membre régulier Avatar de SpecialCharacter
    Inscrit en
    Mai 2007
    Messages
    73
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 73
    Points : 72
    Points
    72
    Par défaut PRIMARY KEY et FOREIGN KEY sur la même colonne ?
    Bonjour,

    Après un tour sur la FAQ et une recherche (toujours bon de se justifier)
    Je ne parviens pas à créer une table dont la clef primaire serait une clef étrangère.
    Dans mon modèle cela correspond en fait à un sous typage et ce modèle logique me convient bien.

    Merci de m'éclairer là dessus,
    Cordialement
    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
    /*
    	PERSONNE
    */
    CREATE TABLE	PERSONNE (
    	id_prsn			int(6),
    	nom_prsn		varchar(30),
    	prenom_prsn		varchar(30),
    	mail_presn		varchar(50),
    	tel_prsn		int(10),
    	mobile_prsn		int(10),
    	adresse_prsn		text,
    	CP_prsn			int(5),
    	ville_prsn		varchar(50)
    )
    ENGINE = InnoDB;
    ALTER TABLE	PERSONNE
    	ADD CONSTRAINT pk_prsn PRIMARY KEY (id_prsn);
     
    -- Sous types personne
    CREATE TABLE	COLLABORATEUR (
    	id_prsn			int(6),
    	niveau_col		int
    )
    ENGINE = InnoDB;
    ALTER TABLE	COLLABORATEUR
    	ADD CONSTRAINT pk_prsn PRIMARY KEY (id_prsn);
     
    -- Héritage du parent (personne)
    ALTER TABLE	COLLABORATEUR
    	ADD CONSTRAINT fk_prsn FOREIGN KEY (id_prsn) REFERENCES PERSONNE(id_prsn);
    /*
    	/PERSONNE
    */

  2. #2
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Points : 11 738
    Points
    11 738
    Par défaut
    Quelle version de MySQL as-tu, et quel message d'erreur obtiens-tu ? Avec la 5.0.45 de Free, ton code fonctionne sans problème.

    Plus fondamentalement, je dirais que tu essaies de forcer un modèle objet en relationnel... Créer une table simplement pour ajouter une colonne, c'est une idée assez bizarre. Il serait plus naturel (ou plus relationnel) de faire ta table ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    CREATE TABLE	PERSONNE (
    	id_prsn			int(6) PRIMARY KEY,
    	nom_prsn		varchar(30),
    	prenom_prsn		varchar(30),
    	mail_presn		varchar(50),
    	tel_prsn		int(10),
    	mobile_prsn		int(10),
    	adresse_prsn		text,
    	CP_prsn			int(5),
    	ville_prsn		varchar(50),
            niveau_col		int NULL 
    )
    ENGINE = InnoDB;
    Pour pousser plus loin dans le chipotage : en relationnel les tables sont des ensembles (et non des classes), et la norme ISO recommande en conséquence qu'elles portent un nom au pluriel (ou un nom collectif), donc il serait plus relationnel de nommer ta table PERSONNES .

  3. #3
    Membre régulier Avatar de SpecialCharacter
    Inscrit en
    Mai 2007
    Messages
    73
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 73
    Points : 72
    Points
    72
    Par défaut
    En premier lieu, merci pour la rapidité de ta réponse

    Ensuite, je ne sais pas si je force le modèle (ça doit faire mal), j'applique ce que j'ai appris au niveau de la conservation de la sémantique. Aussi, la table collaborateur est un sous type de personne, comme tu as du le comprendre, mais un collaborateur participe à une assocation à laquelle personne ne participe pas.
    Le serveur MySQL de ma boite tourne sous le dernier xAMPP (MySQL 5.0.51)

    Je n'obtiens tout simplement pas d'erreur, si je créé d'abord ma clef étrangère et ensuite ma primaire il écrase l'étrangère.
    Et si je créé la primaire puis l'étrangère la primaire reste.

    Je pensais également me tourner vers cette solution si le problème n'était pas résolvable.

  4. #4
    Membre régulier Avatar de SpecialCharacter
    Inscrit en
    Mai 2007
    Messages
    73
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 73
    Points : 72
    Points
    72
    Par défaut
    Etonnement cela fonctionne, SQLYog ne me montre que la clef primaire alors que sous PHPMyAdmin on observe les deux contraintes

    Merci tout de même

  5. #5
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Points : 11 738
    Points
    11 738
    Par défaut
    Citation Envoyé par SpecialCharacter Voir le message
    En premier lieu, merci pour la rapidité de ta réponse

    Ensuite, je ne sais pas si je force le modèle (ça doit faire mal),
    oui ! j'ai mal à mon modèle relationnel
    Citation Envoyé par SpecialCharacter Voir le message
    j'applique ce que j'ai appris au niveau de la conservation de la sémantique. Aussi, la table collaborateur est un sous type de personne, comme tu as du le comprendre, mais un collaborateur participe à une assocation à laquelle personne ne participe pas.
    ... ce qui te permet de savoir si une personne est collaborateur ou non.

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

Discussions similaires

  1. Probleme avec les contraintes primary key et foreign key
    Par haylox dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 17/04/2013, 14h23
  2. Select 10 valeurs sur la même colonne
    Par Ticoche dans le forum Langage SQL
    Réponses: 2
    Dernier message: 20/01/2009, 17h47
  3. Réponses: 1
    Dernier message: 08/07/2008, 10h46
  4. Réponses: 2
    Dernier message: 05/04/2008, 17h33
  5. Foreign key entre 2 schémas d'une même BD?
    Par mona dans le forum Oracle
    Réponses: 2
    Dernier message: 14/10/2005, 19h58

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