Tenho a seguinte tabela:
mytable
---------
id Serial PK
action Integer
model VARCHAR
model_id integer
active BOOL
Mas devido à minha lógica não pode haver valores duplicados com os mesmos valores para model,model_id,action
quando active for true.
Portanto, coloco uma restrição exclusiva:
ALTER TABLE mytable ADD CONSTRAINT constraint_name UNIQUE (model,model_id,action,active);
Mas isso não me impede de ter a restrição exclusiva apenas quando active=true. Além disso, minha tabela é pré-preenchida com valores duplicados, portanto, quero definir active=false em dduplicate e manter apenas um registro com value=true
você sabe alguma boa idéia de como posso fazer isso além de apenas escrever uma instrução de atualização antes de aplicar a restrição ?
Um índice parcial como sugerido por @ypercube é provavelmente a melhor solução. Se por algum motivo você quiser mantê-lo no nível lógico, você pode gerar uma coluna:
Se ATIVO: concatenar as colunas "parcialmente únicas", usei um separador de token para distinguir as colunas, resultado de 'a' || 'bc' deve ser diferente de 'ab' || 'c'
Se NÃO ATIVO: use a chave primária em vez das colunas "únicas"
Usei xyz como nome da coluna gerada porque não conhecia melhor :-)