Précédent   Forum des professionnels en informatique > Bases de données > Langage SQL
Langage SQL Forum d'entraide sur le langage SQL et sur les questions liées à la conception de schéma (DDL). Cours SQL
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 14/05/2011, 08h54   #1
Nouveau Membre du Club
 
Inscription : novembre 2010
Messages : 146
Détails du profil
Informations forums :
Inscription : novembre 2010
Messages : 146
Points : 32
Points : 32
Par défaut Je ne peux pas créer ma clef etrangère

Bonjour, j'ai un difficulté à créer ma clé étrangère

voici 2 tablse :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
-- Table: civilites
 
-- DROP TABLE civilites;
 
CREATE TABLE civilites
(
  id_civilite serial NOT NULL,
  libelle_civilite character(20)
)
WITH (
  OIDS=FALSE
);
ALTER TABLE civilites OWNER TO postgres;
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
-- Table: personnes
 
-- DROP TABLE personnes;
 
CREATE TABLE personnes
(
  id_perso serial NOT NULL,
  civilite integer,
  CONSTRAINT personnes_pkey PRIMARY KEY (id_perso)
)
WITH (
  OIDS=FALSE
);
ALTER TABLE personnes OWNER TO postgres;
j'ai une table personnes et une table civilites
je souhaite créer une clef étrangère sur la table personnes de la colonne
civillite , sa clef primaire sera id_civile


voici la requête que j'ai faite
Code :
1
2
3
 
ALTER TABLE civilites
ADD FOREIGN KEY (civilite) REFERENCES personnes(id_civile);
j'ai une grosse erreur
Code :
1
2
3
4
5
6
7
8
9
 
ERREUR:  il n'existe aucune contrainte unique correspondant aux clés données pour la
table « civilites » référencée
 
********** Erreur **********
 
ERREUR: il n'existe aucune contrainte UNIQUE correspondant aux clés données pour la
TABLE « civilites » référencée
État SQL :42830
j'ai mis dans la table civilites une clef primaire dans id_civilite ? cela ne suffit pas ??

1 ma nomination de la clé étrangère est-elle bonne ?
2 que faut-il modifier pour que cela fonctionne ?

je vous remercie d'avance de vos aides
neufrdb est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/05/2011, 09h13   #2
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 001
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 001
Points : 18 262
Points : 18 262
Envoyer un message via MSN à CinePhil
D'après la définition que tu donnes de ta table civilite, elle n'a pas de clé primaire.

De plus, il faut créer ta clé étrangère dans la table personne et non pas dans la table civilite.

Au passage, on écrit en principe les noms de tables et de colonnes au singulier.

Bref, tu peux recommencer !

Et puisque tu travailles avec Postgresql, ce qui est un très bon choix, utilise PGAdmin, c'est plus facile.
__________________
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 déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/05/2011, 09h32   #3
Nouveau Membre du Club
 
Inscription : novembre 2010
Messages : 146
Détails du profil
Informations forums :
Inscription : novembre 2010
Messages : 146
Points : 32
Points : 32
merci cinePhile

Code :
1
2
 
Au passage, ON écrit en principe les noms de TABLES et de colonnes au singulier.(j'ai mal appris avec les forums)
merci de ton conseil , je pensais qu'il fallait mettre au pluriel car dans la table civile il y a plusieurs civile.

pour mieux le voir si je les mets en majuscule les noms des tables ?


Code :
1
2
 
Et puisque tu travailles avec Postgresql, ce qui est un très bon choix, utilise PGAdmin, c'est plus facile.

j'utilise PGAdminIII voici ce que j'ai fait

je clique sur la table personnes
en dessous je clique sur l’icône rouge (les flèches opposées rouges),
clic droit ajouter une clé étrangère
dans onglet propriété je sélectionne la table de référence qui est civilites (je corrigerai plus tard pour le s)
dans onglet colonne , onglet
Code :
1
2
3
 
  colonne LOCAL je choisis civilite
  colonne reference vers : id_civilite
je clique sur ajouter mais le bouton "ok" est grisé, en bas de la fenêtre
veillez indiquer le nom d'index

qui doit être index ?
penses-tu que j'ai fait cela à l'envers ?

neufrdb est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/05/2011, 09h43   #4
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 001
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 001
Points : 18 262
Points : 18 262
Envoyer un message via MSN à CinePhil
Citation:
merci de ton conseil , je pensais qu'il fallait mettre en pluriels car dans la table civile il y a plusieurs civile.
C'est "civile" ou "civilite" ? Faudrait savoir ! L'informatique est une science précise !
Ca devrait être "civilite" puisque c'est comme ça que ça s'appelle en français.

Quant au singulier, ça vient de la lecture des modèles conceptuels de données. Le cheminement de conception est le suivant :
1) Règle de gestion
Une personne est qualifiée par une seule civilité et une civilité peut qualifier plusieurs personnes.
=> tout est au singulier.

2) MCD
civilite -0,n----Qualifier----1,1- personne
=> tout est au singulier.

3) Tables
civilite (civ_id, civ_libelle)
personne (prs_id, prs_id_civilite...)
=> tout est au singulier.

Citation:
pour mieux le voire si je les met en majuscule les noms des tables ?
Je te déconseille fortement d'utiliser les majuscules dans les noms de tables et de colonnes avec Postgresql car il ajoute des guillemets et ensuite tu es obligé d'utiliser ces guillemets partout, ce qui complique l'écriture des requêtes et les rend incompatibles avec d'autres SGBD.

Pour le reste, tu as peut-être tout simplement oublié ceci :
Citation:
D'après la définition que tu donnes de ta table civilite, elle n'a pas de clé primaire.
Commence par créer une clé primaire sur la table civilite.
__________________
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 déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/05/2011, 09h58   #5
Nouveau Membre du Club
 
Inscription : novembre 2010
Messages : 146
Détails du profil
Informations forums :
Inscription : novembre 2010
Messages : 146
Points : 32
Points : 32
j'ai fait un screen shoot normalement il y a toutes les informations que
civlite a une clef primaire sur civ_id

Code :
1
2
 
De plus, il faut créer ta clé étrangère dans la TABLE personne et non pas dans la TABLE civilite.
en faisant comme le schema ci dessous, je met bien la cles etrangère dans la table personne ??





dans l'onglet propriégé a quoi sert couverture de l'index ? et la case FK_auto ?
et faut t'il remplire la case nom (image de gauche n'est pas bonne)

neufrdb est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/05/2011, 16h27   #6
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 001
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 001
Points : 18 262
Points : 18 262
Envoyer un message via MSN à CinePhil
Il faut que la colonne portant la clé étrangère dans la table personne soit indexée pour pouvoir servir de clé étrangère.
D'après ton image, il n'y a pas d'index, hormis la clé primaire, dans les deux tables.
__________________
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 déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 14/05/2011, 18h22   #7
Nouveau Membre du Club
 
Inscription : novembre 2010
Messages : 146
Détails du profil
Informations forums :
Inscription : novembre 2010
Messages : 146
Points : 32
Points : 32
merci beaucoup à toi, maintenant cela fonctionne , je ne savais pas qu'il fallait indexer ce champ,et si j'indexais tous lse champs de mes champs ? cela servirait à quelque chose ?
neufrdb est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/05/2011, 01h16   #8
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 001
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 001
Points : 18 262
Points : 18 262
Envoyer un message via MSN à CinePhil
Pour savoir quoi indexer, va faire un tour chez SQLPro. Trop d'index tue l'indexation et nuit aux performances.
__________________
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 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 13h25.


 
 
 
 
Partenaires

Hébergement Web