Monday, September 8, 2008

[pgsql-fr-generale] Re: [pgsql-fr-generale] Pas de contrainte référentielle vers un champ non-UNIQUE :-(

Stephane Bortzmeyer 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 ?
>

Pourquoi contrainte supplémentaire ? une référence, c'est une clé
étrangère. L'idée de la clé étrangère, c'est qu'*un* élément est lié à
*un ou plusieurs* autres. Ce premier élément doit être dissociable. Et
il doit être dissociable pour que les règles ON UPDATE et ON DELETE des
clés étrangères puissent fonctionner.

Mais si je comprends bien, tu veux faire un système où un ou plusieurs
éléments d'un table sont liés à un ou plusieurs éléments d'une table Y
(du n-n à la place du 1-n de PostgreSQL).

> Deuxième question : quel contournement utiliser à part abandonner la
> sécurité que me fournit REFERENCES ?
>

Il va falloir que tu crées un système de triggers qui fera la même
chose, mais qui n'implémentera pas ON UPDATE et ON DELETE.


--
Guillaume.
http://www.postgresqlfr.org
http://dalibo.com

--
Sent via pgsql-fr-generale mailing list (pgsql-fr-generale@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-fr-generale

No comments: