PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 30/07/2014 22:24:04

PmGs7
Membre

Contrainte Foreign Key impossible sans préciser le nom de la clé

Bonjour,

J'ai 2 tables contenant chacune 1 enregistrement avec un champ identique et ... je n'arrive pas à créer une contrainte Foreign Key sans être obligé de spécifier le champ identique ! ?

Si un lecteur veut bien reproduire ces erreurs et si possible m'éclairer, je le remercie d'avance.

PmG

Version utilisée : Postgresql 9.1

-----Les erreurs ---------------------------------------------------
ALTER TABLE noms ADD CONSTRAINT noms_id_ville FOREIGN KEY (id_ville) REFERENCES villes MATCH FULL ON UPDATE CASCADE;
ERREUR:  une instruction insert ou update sur la table « noms » viole la contrainte de clé
étrangère « noms_id_ville »
DÉTAIL : La clé (id_ville)=(idv1) n'est pas présente dans la table « villes ».

ALTER TABLE noms2 ADD CONSTRAINT noms2_id_ville FOREIGN KEY (id_ville) REFERENCES villes2 MATCH FULL ON UPDATE CASCADE;
ERREUR:  il n'existe pas de clé étrangère pour la table « villes2 » référencée

-----La solution --------------------------------------------------------------
...........REFERENCES villes (id_ville) ..................

-----La question -------------------------------------------------------------
Pourquoi, sur cette exemple, je dois préciser id_ville sachant que ce champ est identique dans les 2 tables ?

-----Le dump de la base ----------------------------------------------------

SET statement_timeout = 0;
SET client_encoding = 'UTF8';
SET standard_conforming_strings = on;
SET check_function_bodies = false;
SET client_min_messages = warning;

SET search_path = public, pg_catalog;

SET default_tablespace = '';

SET default_with_oids = false;

CREATE TABLE noms (
    id_nom character varying(64) NOT NULL,
    id_ville character varying(8)
);

CREATE TABLE villes (
    insee character varying(5) NOT NULL,
    id_ville character varying(8)
);

COPY noms (id_nom, id_ville) FROM stdin;
nn_pp    idv1
\.

COPY villes (insee, id_ville) FROM stdin;
123    idv1
\.


ALTER TABLE ONLY noms
    ADD CONSTRAINT noms_pkey PRIMARY KEY (id_nom);

ALTER TABLE ONLY villes
    ADD CONSTRAINT villes_pkey PRIMARY KEY (insee);


CREATE UNIQUE INDEX ville_ide ON villes USING btree (id_ville);


CREATE TABLE noms2 (
    id_nom character varying(64) NOT NULL,
    id_ville character varying(8)
);

CREATE TABLE villes2 (
    id_ville character varying(8)
);

COPY noms2 (id_nom, id_ville) FROM stdin;
nn_pp    idv1
\.

COPY villes2 (id_ville) FROM stdin;
idv1
\.


ALTER TABLE ONLY noms2
    ADD CONSTRAINT noms2_pkey PRIMARY KEY (id_nom);

CREATE UNIQUE INDEX ville2_ide ON villes2 USING btree (id_ville);


REVOKE ALL ON SCHEMA public FROM PUBLIC;
REVOKE ALL ON SCHEMA public FROM postgres;
GRANT ALL ON SCHEMA public TO postgres;
GRANT ALL ON SCHEMA public TO PUBLIC;

Dernière modification par PmGs7 (30/07/2014 23:13:42)

Hors ligne

#2 31/07/2014 19:02:45

rjuju
Administrateur

Re : Contrainte Foreign Key impossible sans préciser le nom de la clé

Bonjour,

avez vous essayé en spécifiant le nom de la colonne dans la table de destination ? par exemple :


ALTER TABLE noms ADD CONSTRAINT noms_id_ville FOREIGN KEY (id_ville) REFERENCES villes (id_ville) MATCH FULL ON UPDATE CASCADE;

Hors ligne

#3 31/07/2014 23:57:40

PmGs7
Membre

Re : Contrainte Foreign Key impossible sans préciser le nom de la clé

Bonjour,

cette solution était déjà proposée dans mon post, elle est tout à fait fonctionnelle.

Ma question n'est pas un problème en soi, puisque la solution est toute simple, il s'agit 'simplement' de comprendre pourquoi une fonctionnalité prévue dans la documentation, qui fonctionnait sans problème ( j'utilise postgresql depuis plus de 15 ans ) et ne fonctionne pas sur cet exemple.

- ou la réponse est évidente et c'est simplement moi qui 'déconne' et je m'excuse d'avance pour le dérangement

- ou ... il s'agit peut-être d'un bug à faire remonter, même s'il semble anodin en apparence.

Cdlt.

PmG

Hors ligne

Pied de page des forums