#1 Wed 21 September 2011 10:44
- Roxane
- Participant occasionnel
- Date d'inscription: 9 Aug 2011
- Messages: 15
[Postgre/Postgis] Problème contrainte unique
Bonjour,
J'ai une base de données sous Postgis avec 3 tables principale: perim_site (geometrique), habitat (geometrique) et hab_phyto (non géométrique).
perim_site a une double clé primaire: num_site + id_vers_geom
donc pour habitat qui y fait référence on a une triple clé primaire: id_hab (serial) + num_site + id_vers_geom
et enfin il me faut donc pour hab_phyto une quadruple clé primaire (j'ai des doutes....) : id_hab + num_site + id_vers_geom + code_phyto
J'ai mis pour id_hab, num_site et id_vers_geom une reference vers la table habitat, mais Postgis me dit un message d'erreur à la création de la table hab_phyto:
Requête SQL de création de la table:
CREATE TABLE hab_phyto
(
code_cb character varying(15),
id_hab integer,
num_site character varying (9),
id_vers_geom integer,
"surf_%_hab" real,
id_statut integer,
code_eur_27 character varying(20),
code_alliance character varying(25) NOT NULL,
code_cahab character varying(25),
code_eunis character varying(20),
id_dynam integer,
CONSTRAINT pk_hab_phyto PRIMARY KEY (id_hab, num_site, id_vers_geom, code_alliance),
CONSTRAINT fk_cahab FOREIGN KEY (code_cahab)
REFERENCES cahab (code_cahab) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT fk_code_cb FOREIGN KEY (code_cb)
REFERENCES corine_biotopes (code_cb) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT fk_code_phyto FOREIGN KEY (code_alliance)
REFERENCES code_phyto (code_alliance) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT fk_dynam FOREIGN KEY (id_dynam)
REFERENCES dynamique (id_dynam) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT fk_eunis FOREIGN KEY (code_eunis)
REFERENCES eunis (code_eunis) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT fk_natura_2000 FOREIGN KEY (code_eur_27)
REFERENCES natura_2000 (code_eur_27) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT fk_statut FOREIGN KEY (id_statut)
REFERENCES statut (id_statut) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT fk_num_site FOREIGN KEY (num_site)
REFERENCES habitat (num_site) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT fk_vers_geom FOREIGN KEY (id_vers_geom)
REFERENCES habitat (id_vers_geom) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT fk_id_hab FOREIGN KEY (id_hab)
REFERENCES habitat (id_hab) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION
)
WITH (OIDS=FALSE);
ALTER TABLE hab_phyto OWNER TO postgres;
Message de Postgis:
NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "pk_hab_phyto" for table "hab_phyto"
ERROR: there is no unique constraint matching given keys for referenced table "habitat"
********** Erreur **********
ERROR: there is no unique constraint matching given keys for referenced table "habitat"
État SQL :42830
Merci d'avance pour votre aide
Hors ligne
#2 Wed 21 September 2011 11:33
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: [Postgre/Postgis] Problème contrainte unique
Bonjour,
J'ai une base de données sous Postgis avec 3 tables principale: perim_site (geometrique), habitat (geometrique) et hab_phyto (non géométrique).
perim_site a une double clé primaire: num_site + id_vers_geom
donc pour habitat qui y fait référence on a une triple clé primaire: id_hab (serial) + num_site + id_vers_geom
et enfin il me faut donc pour hab_phyto une quadruple clé primaire (j'ai des doutes....) : id_hab + num_site + id_vers_geom + code_phyto
J'ai mis pour id_hab, num_site et id_vers_geom une reference vers la table habitat, mais Postgis me dit un message d'erreur à la création de la table hab_phyto:
Requête SQL de création de la table:CREATE TABLE hab_phyto
(
code_cb character varying(15),
id_hab integer,
num_site character varying (9),
id_vers_geom integer,
"surf_%_hab" real,
id_statut integer,
code_eur_27 character varying(20),
code_alliance character varying(25) NOT NULL,
code_cahab character varying(25),
code_eunis character varying(20),
id_dynam integer,
CONSTRAINT pk_hab_phyto PRIMARY KEY (id_hab, num_site, id_vers_geom, code_alliance),
CONSTRAINT fk_cahab FOREIGN KEY (code_cahab)
REFERENCES cahab (code_cahab) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT fk_code_cb FOREIGN KEY (code_cb)
REFERENCES corine_biotopes (code_cb) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT fk_code_phyto FOREIGN KEY (code_alliance)
REFERENCES code_phyto (code_alliance) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT fk_dynam FOREIGN KEY (id_dynam)
REFERENCES dynamique (id_dynam) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT fk_eunis FOREIGN KEY (code_eunis)
REFERENCES eunis (code_eunis) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT fk_natura_2000 FOREIGN KEY (code_eur_27)
REFERENCES natura_2000 (code_eur_27) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT fk_statut FOREIGN KEY (id_statut)
REFERENCES statut (id_statut) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT fk_num_site FOREIGN KEY (num_site)
REFERENCES habitat (num_site) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT fk_vers_geom FOREIGN KEY (id_vers_geom)
REFERENCES habitat (id_vers_geom) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT fk_id_hab FOREIGN KEY (id_hab)
REFERENCES habitat (id_hab) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION
)
WITH (OIDS=FALSE);
ALTER TABLE hab_phyto OWNER TO postgres;
Message de Postgis:NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "pk_hab_phyto" for table "hab_phyto"
ERROR: there is no unique constraint matching given keys for referenced table "habitat"
********** Erreur **********
ERROR: there is no unique constraint matching given keys for referenced table "habitat"
État SQL :42830
Merci d'avance pour votre aide
Bonjour,
Il me semble que vous confondez cles primaires et clés étrangères:
les tables référencant une table donnée ne doivent pas définir une clé primaire a 4 champs, mais une clé primaire, puis une clé etrangère vers la table a référencer.
D'autre part (mais c'est tres personnel), je n'aime pas créer des clés primaires qui soient "metier", c'est a dire qui ont des valeurs pertinentes.
Je prefere créer une clé primaire avec par exemple un serial (plus rapide a indexer, a chercher, a croiser) et faire des contraintes uniques sur mes colonnes métiers.
Dans les autres tables dépendantes, je procede de la meme facon: cles etrangeres vers la cle primaire non métier de la table, puis contraintes uniques sur les colonnes métier.
(je sais pas si je suis tres clair )
Nicolas
Hors ligne
#3 Wed 21 September 2011 14:42
Re: [Postgre/Postgis] Problème contrainte unique
Bonjour
Je suis d'accord avec Nicolas, je pense qu'il vaudrait mieux faire un champ id_hab_phyto en serial et le définir en cléf primaire.
Bonne journée
Hors ligne
#4 Wed 21 September 2011 16:59
- Roxane
- Participant occasionnel
- Date d'inscription: 9 Aug 2011
- Messages: 15
Re: [Postgre/Postgis] Problème contrainte unique
Merci pour vos réponses,
c'est vrai que c'est beaucoup plus simple comme ça.
En fait je voulais mettre des doubles clés primaires pour éviter les doublons à la récupération des tables pour intégration dans la base de données.
Mais ça fera l'objet d'un autre travail.
Bonne soirée.
Hors ligne