mauricio pullabuestan escribió:

> CREATE TABLE permiso
> (
>   numero_permiso integer NOT NULL,
>   director_id character varying(5),
>   dependiente_id character varying(5),
>   jornada_id character varying(2),
>   permiso_periodo tstzrange,
>   observaciones character varying(100),
>   activo boolean,
>   CONSTRAINT pk_permisos PRIMARY KEY ( numero_permiso)
> );
> 
> 
> Necesito evitar que se solapen los permisos de dependiente_id, 
> permiso_periodo.
> 
> 
> Al ser 2 campos de distintos tipos no se si se puede y como hacer un exclude 
> o un indice unico con estos 2 campos, de poder cual seria la mejor opción, si 
> no se puede como podría evita overlaps  

Hola, esto en Postgres se llama "restricción de exclusión" (exclusion
constraint en inglés); necesitas un índice gist con soporte para los
tipos en cuestión.  Algo así

create extension btree_gist;    -- esto es para el operador = en varchar

CREATE TABLE permiso (
 numero_permiso integer NOT NULL,
 director_id character varying(5),
 dependiente_id character varying(5),
 jornada_id character varying(2),
 permiso_periodo tstzrange,
 observaciones character varying(100),
 activo boolean,
 CONSTRAINT pk_permisos PRIMARY KEY ( numero_permiso),
 constraint no_traslape exclude using gist (dependiente_id with =, 
permiso_periodo with &&));

-- 
Álvaro Herrera                https://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services


Reply via email to