Re: Pas de contrainte référentielle vers un champ non-UNIQUE :-(

From: Jean-Samuel Reynaud <reynaud(at)elma(dot)fr>
To: Stephane Bortzmeyer <bortzmeyer(at)nic(dot)fr>
Cc: pgsql-fr-generale(at)postgresql(dot)org
Subject: Re: Pas de contrainte référentielle vers un champ non-UNIQUE :-(
Date: 2008-09-08 15:16:30
Message-ID: 20080908171630.2e90f814@reynaud-dell
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-fr-generale

Cette limitation vient en partie, à mon sens, du fait que les références
sont gérées dans PostgreSQL via des triggers.
Aussi les triggers sont utilisés lors de la suppression/update dans ta
table Foo et lors de l'insertion dans ta table Bar.
Cela voudrait ainsi dire que lorsque tu supprimes une entrée dans Foo,
le trigger doive vérifier la non-existence dans Bar ainsi que, si
existence il y a, la présence d'un doublon dans Foo autorisant la
suppression.
Techniquement c'est possible mais je pense que ça complexifie les
choses.
D'autre part, conceptuellement, cela revient à faire une relation une
relation n to n. Je ne sais pas si c'est très normal de cette façon là.
Quelqu'un sait si c'est possible sur d'autre base de données (genre
oracle, sql server)

Le contournement pour le coup est relativement simple. Il suffit juste
d'écrire des triggers équivalent à ce que fait PostgreSQL avec le test
tel que je l'ai décris en plus un peu plus haut. Regarde du côté des
contrib pour voir si ça n'existe pas déjà... Mais bon c'est plus des
références Postgresql dans ce cas là...

Voila...
Le Mon, 8 Sep 2008 16:56:35 +0200, Stephane
Bortzmeyer <bortzmeyer(at)nic(dot)fr> a écrit :

> J'essaie de mettre une contrainte référentielle mais le champ visé n'a
> pas été déclaré comme UNIQUE :
>
> essais=> CREATE TABLE Foo(name TEXT NOT NULL);
> CREATE TABLE
> essais=> CREATE TABLE Bar(truc TEXT, machin TEXT REFERENCES
> Foo(name)); ERROR: there is no unique constraint matching given keys
> for referenced table "foo"
>
> [Si Foo(name) est déclaré UNIQUE, cela passe.]
>
> Première question : pourquoi PostgreSQL 8.3 impose t-il cette
> contrainte supplémentaire qui ne me semble pas logique ?
>
> Deuxième question : quel contournement utiliser à part abandonner la
> sécurité que me fournit REFERENCES ?
>

In response to

Responses

Browse pgsql-fr-generale by date

  From Date Subject
Next Message Guillaume Lelarge 2008-09-08 15:42:25 Re: [pgsql-fr-generale] Pas de contrainte référentielle vers un champ non-UNIQUE :-(
Previous Message Stephane Bortzmeyer 2008-09-08 14:56:35 Pas de contrainte référentielle vers un champ non-UNIQUE :-(