Exclusion constraint with negated operator?

Started by Torsten Förtschalmost 3 years ago2 messagesgeneral
Jump to latest
#1Torsten Förtsch
tfoertsch123@gmail.com

Hi,

I wanted to create an exclusion constraint like

EXCLUDE (c1 WITH =, c2 with <>)

This gives an error:

operator <>(integer,integer) is not a member of operator family
"integer_ops"

I can resolve that by using gist and the btree_gist extension.

My question is can I somehow express something like

EXCLUDE (c1 WITH =, c2 with NOT =)

It seems that's not possible at the moment. But is there any obstacle in
principle or is it just not implemented?

We have a ton of overlap operators (geometric, ranges, arrays) but none for
the opposite. Sometimes that's useful for exclusion constraints.

Thanks,
Torsten

#2Tom Lane
tgl@sss.pgh.pa.us
In reply to: Torsten Förtsch (#1)
Re: Exclusion constraint with negated operator?

=?UTF-8?Q?Torsten_F=C3=B6rtsch?= <tfoertsch123@gmail.com> writes:

My question is can I somehow express something like
EXCLUDE (c1 WITH =, c2 with NOT =)
It seems that's not possible at the moment. But is there any obstacle in
principle or is it just not implemented?

Well, it'd likely be a bad idea. Indexes are meant to help you quickly
find a small part of a table that satisfies a condition. Finding the
probably-much-larger part of the table that doesn't satisfy the condition
is something they are bad at. This is why "=" is an indexable operator
while "<>" is not. It's not impossible in principle for "<>" to be an
index operator, but the set of cases where indexing on such a condition
would beat a seqscan is likely to be uselessly small. By the same
token, EXCLUDE constraints using such a condition would be unpleasantly
inefficient.

regards, tom lane