Order-independent multi-field uniqueness constraint? - Mailing list pgsql-general

From Kynn Jones
Subject Order-independent multi-field uniqueness constraint?
Date
Msg-id c2350ba40710191052s4bd51716j10ba9d14be9f06fa@mail.gmail.com
Whole thread Raw
Responses Re: Order-independent multi-field uniqueness constraint?  (brian <brian@zijn-digital.com>)
Re: Order-independent multi-field uniqueness constraint?  (Gregory Stark <stark@enterprisedb.com>)
List pgsql-general
I have a table used to store information about pairs of items.  This
information is independent of the order of the two items in the pair,
so having two records

  X    Y    <info>
  Y    X    <info>

in the table would be redundant.  But as far as I can tell, this
situation would not violate a uniqueness constraint involving the two
fields.

I could add the original constraint that enforces some canonical
order, say X < Y (assuming that they are integer IDs), but I'm trying
to avoid this because it would lead to a significant complication of
many of my queries, which currently ascribe slightly different
semantics to the first and second members of the pair.

The only solution I could think of is to write a function that takes
the two elements as input and returns them in some canonical order:

CREATE OR REPLACE FUNCTION canonicalize( anyelement, anyelement )
  RETURNS anyarray AS
$$
BEGIN
  IF $1 < $2 THEN RETURN ARRAY[ $1, $2 ];
  ELSE            RETURN ARRAY[ $2, $1 ];
  END IF;
END;
$$ LANGUAGE plpgsql;

and this function works as expected, but when I try to use it in a
constraint I get the error:

-> ALTER TABLE foo ADD CONSTRAINT foo_uniq_x_y UNIQUE(canonicalize(x,y));
ERROR:  42601: syntax error at or near "("
LINE 1: ...E foo ADD CONSTRAINT foo_uniq_x_y UNIQUE(canonicalize(x,y));
                                                                ^
LOCATION:  base_yyerror, scan.l:795

I found this puzzling; it's not clear to me why UNIQUE(UPPER(x)) is OK
syntax but not UNIQUE(my_function(x)).

But be that as it may, is there any way to enforce an
order-independent uniqueness constraint without forcing a canonical
ordering on the elements saved in the table.

TIA!

kj

pgsql-general by date:

Previous
From: smiley2211
Date:
Subject: Re: Generating sql to capture fully qualified table names??? - THANKS
Next
From: "Martin Gainty"
Date:
Subject: Re: Problem of installation on Mac