indice, unicidad

Norma Cordero Sanchez norma@vico.fciencias.unam.mx
Thu, 21 May 1998 15:08:17 -0500 (CDT)


On Wed, 20 May 1998, Bruno Unna wrote:

> 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?
> > ...

> 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:

Muchas gracias Bruno te agradezco tu respuesta. 
Nada de malo tienen los indices, lo que sucede es que una de mis columnas
debe de mantener la unicidad, pero no es la llave primaria, y en realidad
muy pocas veces voy a necesitar consultar por esa columna, es por eso mi
pregunta, ademas segun he entendido, el mantenimiento de los indices que
hace el sistema, toma tiempo y espacio en disco, es por eso que queria
evitarlos en esta columna, si era posible, pero por lo que me contestas
me parece que no.

> create table alumnos
>     (cuenta int4, nombre char(60), primary key (cuenta));
> lo cual implica automticamente la unicidad de 'cuenta',
> as como su no-nulidad.
> 

Como tengo aun la version 6.2.1, aun no voy a poder utilizar primary key


> Suerte, saludos.
> 
> P.D.: si alguien averigua qué estoy haciendo mal con los 
> constraints, le voy a agradecer mucho que me informe. :)

Pues yo he utilizado algo como esto, pero no se si te refieras a lo mismo:
CREATE TABLE ejemplo (
atrib1	int4 )
CONSTRAINT ejemplo_cond CHECK ( atrib1 > 0 ) AND ( atrib1 < 20 )
;

	NORMA.

> -- 
>    +------------------------------------------------------+
>    |                                           Bruno Unna |
>    | bruno@sac.com.mx    Pub.key available    ICQ:1858580 |
>    +------------------------------------------------------+
>