Hallo zusammen,
ich suche eine Möglichkeit für eine Tabelle, in deren Spalten NULL-Werte enthalten sein dürfen, so etwas wie einen UNIQUE constraint bezogen auf alle Spalten zu definieren.
Zum Beispiel :
create table t_uni (
a integer,
b integer,
c integer
);
wtest=# select * from t_uni;
a | b | c
---+---+---
1 | |
| 2 |
1 | 2 |
1 | 2 | 3
Der Constraint sollte zu einer Exception führen, wenn versucht wird
(1,null,null), (1,2,3) oder (null,2, null) einzufügen. NULL values sollen also
als normale Werte, die man vergleichen kann, behandelt werden.
Die Logik ist die von ‘is not distinct from’
wtest=# select case when (null,2,null) is not distinct from (null,2,null) then '-> raise exception' else '-> go on' end;
case
--------------------
-> raise exception
(1 row)
wtest=# select case when (null,2,null) is not distinct from (null,2,3) then '-> raise exception' else '-> go on' end;
case
----------
-> go on
(1 row)
Ein ‘PRIMARY KEY (a,b,c)’ funktioniert nicht, weil NULL-Werte nicht erlaubt sind.
Ein ‘UNIQUE (a,b,c)’ funktioniert interessanterweise nicht weil, z.Bsp.
(null,2,null) problemlos mehrfach eingefügt werden kann.
Ich würde diesen Constraint jetzt als Trigger implementieren.
Geht’s nicht irgendwie einfacher ???