Nous utilisons des cookies pour vous garantir la meilleure expérience sur notre site. Si vous continuez à utiliser ce dernier, nous considèrerons que vous acceptez l'utilisation des cookies. J'ai compris ! ou En savoir plus !.
banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

Printemps des cartes 2024

#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: 1536

Re: [Postgre/Postgis] Problème contrainte unique

Roxane a écrit:

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 smile )

Nicolas

Hors ligne

 

#3 Wed 21 September 2011 14:42

cyril_c
Participant assidu
Lieu: Périgueux
Date d'inscription: 13 Jan 2009
Messages: 176
Site web

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

 

Pied de page des forums

Powered by FluxBB