Ing. Esneiker Enriquez Cabrera escribió: > Hola a todos. > > Estoy usando postgres 9.1 donde tengo algunas tablas en las cuales quiero > crear restricciones de unicidad en algunas columnas, por ejemplo que el > campo nombre no permita valores duplicados. El caso es que el gestor me deja > guardar los valores tales como Nombre uno y nombre uno porque los maneja > como valores diferentes, cuando desde el punto de vista del negocio > representan el mismo valor. ¿Cuál sería la forma más eficiente de hacer > esto?
Las restricciones UNIQUE sólo permiten nombres de columna, no expresiones; pero puedes usar una restricción EXCLUSION: alvherre=# create table esneiker (nombre text); CREATE TABLE alvherre=# alter table esneiker add constraint nombre_unico exclude (upper(nombre) with =); ALTER TABLE alvherre=# insert into esneiker values ('nombre uno'); INSERT 0 1 alvherre=# insert into esneiker values ('nombre Uno'); ERROR: llave en conflicto viola restricción por exclusión «nombre_unico» DETALLE: La llave (upper(nombre))=(NOMBRE UNO) está en conflicto con la llave existente (upper(nombre))=(NOMBRE UNO). alvherre=# Me imagino que también querrás agregar algo que elimine los espacios en blanco (y tabs, saltos de línea, etc, o más generalmente cualquier cosa que no sean letras, y quizás puntos) al principio y al final, y los espacios duplicados al medio; que no deje pasar " nombre Uno" ni "nombre uno". Ahora, qué pasa si llegan dos personas que se llaman Esneiker Enríquez. Espero que no las obligues a usar la misma cuenta. -- Álvaro Herrera http://www.2ndQuadrant.com/ PostgreSQL Development, 24x7 Support, Training & Services - Enviado a la lista de correo pgsql-es-ayuda (pgsql-es-ayuda@postgresql.org) Para cambiar tu suscripción: http://www.postgresql.org/mailpref/pgsql-es-ayuda