I need to ensure my database only contains entries where two or more of its columns are unique. This can easily be achieved with a UNIQUE
constraint over those columns.
In my case, I need to forbid duplication only for overlapping time ranges. The table has valid_from
and valid_to
columns. In some cases one might first need to expire the active entry to by setting valid_to = now
, and then inserting a new entry adjusted to valid_from = now
and valid_to = infinity
.
I seem to be able to expire the prior entry without any problems using UPDATE
, but inserting the new entry seems to be troublesome since my base columns are currently UNIQUE
, and therefore can't be added again.
I thought of adding valid_from
and valid_to
as part of the UNIQUE
constraint, but that would just make the constraint more loose, and allow
duplicates and overlapping time ranges to exist.
How do I make a constraint to ensure that duplicates don't exist with overlapping valid_from
and valid_to
tsrange
?
I seem to be looking for EXCLUDE USING GIST
, but it does not seem to support multiple columns? This does not seem to work for me:
ALTER TABLE registration
DROP Constraint IF EXISTS registration_{string.Join('_', listOfAttributes)}_key,
ADD Constraint registration_{string.Join('_', listOfAttributes)}_key EXCLUDE USING GIST({string.Join(',', listOfAttributes)} WITH =, valid WITH &&);