Segue abaixo um exemplo de como trabalhar com índices parciais no postgresql, para saber mais sobre o assunto clique no link que segue:
http://pgdocptbr.sourceforge.net/pg80/indexes-partial.html
EXEMPLO:
-- Criar Table: contato CREATE TABLE contato ( id bigserial NOT NULL, datanascimento date, email character varying(255), nome character varying(255), CONSTRAINT contato_pkey PRIMARY KEY (id), CONSTRAINT contato_email_key UNIQUE (email) ) WITH ( OIDS=FALSE ); ALTER TABLE contato OWNER TO postgres; -- Criando indice parcial (só valida a unicidade do campo e-mail se o mesmo for diferente de null) CREATE INDEX email_ix ON contato (email) WHERE email IS NOT NULL; -- O Comando abaixo pode ser executada várias vezes sem gerar erro INSERT INTO contato (datanascimento,email,nome) values (now(),null,'nome') -- O Comando abaixo gera o seguinte erro quando executado mais de uma vez: -- ERRO: duplicar valor da chave viola a restrição de unicidade "contato_email_key" INSERT INTO contato (datanascimento,email,nome) values (now(),'teste@teste.com.br','nome') -- Ver resultado SELECT * FROM contato
1 | 2010-12-15 | null | nome |
2 | 2010-12-15 | null | nome |
3 | 2010-12-15 | teste@teste.com.br | nome |