É possível ter uma restrição exclusiva personalizada da seguinte maneira? Suponha que eu tenha duas cols subset
e type
, ambas as strings (embora os tipos de dados provavelmente não importem).
Se type
for 'true', então eu quero que a combinação de type
e subset
seja única. Caso contrário, não há restrição. Estou usando o PostgreSQL 8.4 no Debian.
Em outras palavras, você deseja que os valores na coluna
subset
sejam exclusivos entre as linhas em que a colunatype
é 'true'.Um índice exclusivo parcial fará isso:
O tipo de dados importa . Se a coluna
type
forboolean
(provavelmente deveria ser), você pode simplificar:Dessa forma, você pode até fazer combinações com
NULL
únicos, o que não é possível de outra forma. Ver:Isso é complementar à resposta de Erwin acima, mas o PostgreSQL oferece suporte a vários tipos de índices. Estes geralmente não são mutuamente exclusivos. Você pode pensar neles como sendo:
Tudo isso pode ser combinado de várias maneiras. Tudo o que você está fazendo aqui é usar os recursos exclusivos e parciais, de modo que fornece índices exclusivos parciais (que são extremamente úteis conforme você está descobrindo.
Mas suponha que você queira ter um índice que não diferencie maiúsculas de minúsculas no campo do subconjunto em que o tipo é verdadeiro. Em seguida, você adicionaria uma definição funcional:
Observe que isso cria um índice exclusivo na saída da função lower() chamada no atributo subconjunto em que type é verdadeiro.