Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Outils
Outils Forum d'entraide sur les outils pour MySQL. Avant de poster -> Outils 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 31/01/2008, 15h04   #1
Membre du Club
 
Avatar de SpecialCharacter
 
Inscription : mai 2007
Messages : 73
Détails du profil
Informations forums :
Inscription : mai 2007
Messages : 73
Points : 46
Points : 46
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 :
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
*/
SpecialCharacter est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/01/2008, 15h19   #2
Rédacteur/Modérateur

 
Avatar de Antoun
 
Homme Antoine Dinimant
Consultant en Business Intelligence
Inscription : octobre 2006
Messages : 5 854
Détails du profil
Informations personnelles :
Nom : Homme Antoine Dinimant
Âge : 42
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : octobre 2006
Messages : 5 854
Points : 9 540
Points : 9 540
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 :
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 .
__________________
Antoun
Expert SQL, BO, Essbase

La bible d'Essbase est parue !
Antoun est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/01/2008, 15h25   #3
Membre du Club
 
Avatar de SpecialCharacter
 
Inscription : mai 2007
Messages : 73
Détails du profil
Informations forums :
Inscription : mai 2007
Messages : 73
Points : 46
Points : 46
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.
SpecialCharacter est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/01/2008, 16h07   #4
Membre du Club
 
Avatar de SpecialCharacter
 
Inscription : mai 2007
Messages : 73
Détails du profil
Informations forums :
Inscription : mai 2007
Messages : 73
Points : 46
Points : 46
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
SpecialCharacter est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/01/2008, 17h35   #5
Rédacteur/Modérateur

 
Avatar de Antoun
 
Homme Antoine Dinimant
Consultant en Business Intelligence
Inscription : octobre 2006
Messages : 5 854
Détails du profil
Informations personnelles :
Nom : Homme Antoine Dinimant
Âge : 42
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : octobre 2006
Messages : 5 854
Points : 9 540
Points : 9 540
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.
__________________
Antoun
Expert SQL, BO, Essbase

La bible d'Essbase est parue !
Antoun 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 18h23.


 
 
 
 
Partenaires

Hébergement Web