indice, unicidad

Bruno Unna bruno@iac.com.mx
Wed, 20 May 1998 17:07:44 -0500


Norma Cordero Sanchez wrote:
> 
>   Hola, que tal.
> 
> Tengo una dudota: como puedo dar unicidad a una columna, sin tener
> que hacer un indice en ella? hasta donde he checado se que al crear un
> indice se puede tener la opcion de que sea unico tambien:
> 
> create [unique] index <indexname> on <class_name> [using <access_method>]
> ( <attr1> [<type_class1>] [,...] | <funcname>(<attr1>,...) [<type_class>]
> );
> 
> pero como le hago si solo quiero que sean "unicos" los valores, pero no
> indexar?

Lo único que se me ocurre por el momento es el uso de una característica 
llamada 'constraint' durante la creación de la tabla. Sintaxis:
create table <class_name>
        (<attr1> <type1> [default <expression>] [not null] [,...])
        [inherits (<class_name1>,...<class_nameN>)
        [[constraint <name>] check <condition> [,...] ]
;
pero eso tiene dos problemas:
a) es ineficiente; cada inserción/actualización implica la revisión 
   de la condicion por parte del manejador;
b) no funciona (al menos, yo no he logrado sacar a psql de 
   'ERROR:  parser: parse error at or near "constraint"' cuando he 
   querido jugar con los constraints).   :)

En todo caso, yo quisiera preguntarte, Norma: ¿qué tienen de malo 
los índices? Puedes crear uno implícitamente al crear la tabla, 
y desentenderte de él:
create table alumnos 
    (cuenta int4, nombre char(60), primary key (cuenta));
lo cual implica automáticamente la unicidad de 'cuenta', 
así como su no-nulidad.

Suerte, saludos.

P.D.: si alguien averigua qué estoy haciendo mal con los 
constraints, le voy a agradecer mucho que me informe. :)
-- 
   +------------------------------------------------------+
   |                                           Bruno Unna |
   | bruno@sac.com.mx    Pub.key available    ICQ:1858580 |
   +------------------------------------------------------+