Dados dos enteros, inicio y fin, y una clave externa, ¿cómo defino una restricción unique en el intervalo inicio: final inclusive, y la clave externa?
Dado que tengo las siguientes entradas en mi tabla:
+-------+-----+--------------------------------------+ | start | end | foreign_key | +-------+-----+--------------------------------------+ | 10 | 20 | 04ef8258-917c-46d6-8db3-9c704d3f4fbd | +-------+-----+--------------------------------------+ | 40 | 60 | 04ef8258-917c-46d6-8db3-9c704d3f4fbd | +-------+-----+--------------------------------------+Entonces, las siguientes inserciones deberían fallar:
+-------+-----+--------------------------------------+ | start | end | foreign_key | +-------+-----+--------------------------------------+ | 30 | 50 | 04ef8258-917c-46d6-8db3-9c704d3f4fbd | +-------+-----+--------------------------------------+ | 12 | 18 | 04ef8258-917c-46d6-8db3-9c704d3f4fbd | +-------+-----+--------------------------------------+Lo que he intentado hasta ahora:
alter table some_table add constraint unique_interval_to_foreign_key_constraint unique (start, end, foreign_key)Esto no funciona ya que solo define la restricción única en puntos discretos y la clave externa, y no el rango.
Cualquier ayuda sería apreciada.
Agregar respuesta para completar:
CREATE EXTENSION btree_gist; ALTER TABLE some_table ADD CONSTRAINT unique_interval_to_foreign_key_constraint EXCLUDE USING gist (foreign_key WITH =, int4range(start, end, '[]') WITH && );