Em 20 de julho de 2013 20:30, Danilo Silva <[email protected]>escreveu:

> Pessoal,
>
> Tenho uma tabela de cadastro de faixas de ceps
> (cliente,cepinicial,cepfinal), onde não é permitido duplicidade de faixas
> para o mesmo cliente e que uma faixa fique dentro de outra, exemplo:
>
> Correto
> codigo | cliente | cepinicial | cepfinal
> --------+---------+------------+----------
>       1 |       1 | 01000000   | 01599999
>       2 |       1 | 02000000   | 02999999
>       3 |       1 | 03000000   | 04999999
> (3 rows)
>
>
> Errado
> codigo | cliente | cepinicial | cepfinal
> --------+---------+------------+----------
>       1 |       1 | 01000000   | 01599999
>       2 |       1 | 02000000   | 02999999
>       3 |       1 | 02500000   | 04999999
> (3 rows)
>
>
> Errado pois o cep 02500000 já existe dentro da faixa anterior. Atualmente
> eu bloqueio o insert na aplicação e criei uma regra com *DO INSTEAD
> NOTHING* para evitar a duplicidade. Qual a melhor forma de evitar esses
> tipos de duplicidade, ou está certo da forma que está?
>
> []s
> Danilo
>
> _______________________________________________
> pgbr-geral mailing list
> [email protected]
> https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
>
>

Bom dia Danilo,
eu fiz através de uma trigger mais ou menos parecido, a diferença foi que
eu tinha uma data e nao poderia estar m um intervalo ja existente.

 create or replace function not_permit_double () returns trigger as
$tg_not_permit_double$
    begin
if (new.numero>0) and (new.tipoacesso ='R') and (exists(SELECT 1 FROM
dah.reserva res WHERE new.numero = res.numero
 AND ((new.datain>=res.datain and new.datain <res.dataout) or
(new.dataout>res.datain and new.dataout<=res.dataout) or
     (new.datain<=res.datain and new.datain <res.dataout and
new.dataout>res.datain) or
     (new.datain<=res.datain and new.datain <res.dataout and
new.dataout>=res.dataout) ))) then
        raise EXCEPTION 'Numero ja existente!!!';

END IF;
    RETURN new;
    end;
$tg_not_permit_double$ LANGUAGE plpgsql;

 create trigger tg_not_permit_double before insert on dah.reserva
  for each row execute procedure not_permit_double();



-- 

Douglas Fabiano Specht
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a