Restrição exclusiva diferida, sem distinção entre maiúsculas e minúsculas
É possível no PostgreSQL criar uma restrição exclusiva deferível em uma coluna de caracteres, mas não diferencia maiúsculas de minúsculas?
Vamos supor a seguinte tabela básica:
CREATE TABLE sample_table (
my_column VARCHAR(100)
);
Se a restrição de adiamento não for necessária, é tão simples quanto criar um índice exclusivo com função, por exemplo:
CREATE UNIQUE INDEX my_unique_index ON sample_table(UPPER(my_column));
A verificação de restrição adiada requer a criação da restrição explicitamente, por exemplo:
ALTER TABLE sample_table
ADD CONSTRAINT my_unique_constraint UNIQUE(my_column)
DEFERRABLE INITIALLY IMMEDIATE;
E infelizmente não é possível usar funções arbitrárias em restrições exclusivas.
Uma solução possível seria criar uma coluna adicional com o mesmo conteúdo quemy_column
, mas maiúsculas, atualizadas por meio de um gatilho após cada atualização / inserção e, em seguida, criar uma restrição exclusiva diferida nessa coluna artificial. Isso, no entanto, soa como um hack realmente feio.
Alternativamente, deve ser possível usarCREATE CONSTRAINT TRIGGER
e verificar manualmente a exclusividade de maiúsculas e minúsculas (claro que um índice regular ainda seria necessário). Isso soa um pouco complicado demais para um requisito tão simples (e popular, suponho).
Existe alguma maneira mais simples e / ou mais elegante em torno desta limitação?