Restricción única diferible, insensible a mayúsculas y minúsculas
¿Es posible en PostgreSQL crear una restricción única diferible en una columna de caracteres, pero no distingue entre mayúsculas y minúsculas?
Asumamos la siguiente tabla básica:
CREATE TABLE sample_table (
my_column VARCHAR(100)
);
Si no se necesita una restricción diferible, es tan simple como crear un índice único con función, por ejemplo:
CREATE UNIQUE INDEX my_unique_index ON sample_table(UPPER(my_column));
La verificación de restricción diferida requiere crear la restricción explícitamente, por ejemplo:
ALTER TABLE sample_table
ADD CONSTRAINT my_unique_constraint UNIQUE(my_column)
DEFERRABLE INITIALLY IMMEDIATE;
Y, desafortunadamente, no es posible usar funciones arbitrarias en una restricción única.
Una posible solución sería crear una columna adicional con el mismo contenido quemy_column
, pero en mayúsculas, actualizado a través de un disparador después de cada actualización / inserción, luego cree una restricción única diferible en esta columna artificial. Esto, sin embargo, suena como un hack muy feo.
Alternativamente, debería ser posible utilizarCREATE CONSTRAINT TRIGGER
y verificar manualmente la singularidad que distingue entre mayúsculas y minúsculas (por supuesto, aún sería necesario un índice regular). Esto suena un poco demasiado complicado para un requisito tan simple (y popular, supongo).
¿Hay alguna forma más simple y / o elegante de evitar esta limitación?