[Pgsql-ayuda] Incremento por defecto

Antonio Castro acastro@ciberdroide.com
Sun, 17 Mar 2002 09:26:50 +0100 (CET)


On Wed, 13 Mar 2002, Daniel Escobar wrote:

> Hola lista saludos a todos.
> Mi consulta es como obtener en una tabla un
> campo que se incremente por defecto cada vez
> que ingreso una nueva fila de datos.
> La idea es tener un identificador unico para
> cada fila.

Voy a resumir hasta donde yo se pero ruego que alguien me=20
corrija si cometo alg=FAn error.


Para lo que tu preguntas lo m=E1s com=FAn es usar un contador de secuencia.

test=3D> CREATE SEQUENCE contador1 ;

Este objeto tiene asociado unas funciones.

test=3D> SELECT curval('contador1') ; -- Para obtener el valor actual
test=3D> SELECT nextval('contador1') ; -- Para obtener el siguiente valor
test=3D> SELECT setval('contador1', 55 ) ; -- para cambiar su valor

La forma en que se usa es declarando un contador y asociandolo como
valor por defecto en la clave primaria de una tabla.

CREATE SEQUENCE contador1 ;
CREATE tabla_ejemplo (
=09clave int4 DEFAULT nextval('contador1') NOT NULL ,
=09....
=09PRIMARY KEY (clave)) ;

En la clausula de inserci=F3n para la 'tabla_ejemplo' tendr=EDas que omitir
el campo 'clave' para que tome el valor por defecto.

Se puede hacer esto mismo de forma m=E1s simple usando el tipo SERIAL que
crea de forma implicita un contador de secuencia.

CREATE tabla_ejemplo (
=09clave SERIAL NOT NULL ,
=09....
=09PRIMARY KEY (clave)) ;

En la pr=E1tica existe otra t=E9cnica para obtener claves =FAnicas sin tene=
r que
introducirlas cada vez. Se usa para ello el identificador oid. Cata fila
de una tabla posee un valor oid. Hay que consultarlo de forma explicita
ya que usando SELECT * FROM tabla ; no aparece la columna oid. Es decir=20
habr=EDa que hacer SELECT oid, * FROM tabla ; para que aparezca.=20

Todas las tablas tienen oid. Es un valor que no se puede modificar y est=E1
asociado probablemente a la posici=F3n f=EDsica del registro en la tabla.
Se puede referenciar en tablas foraneas mediante int4 o oid. El valor de
oid queda fijado durante la operaci=F3n INSERT o UPDATE sobre un registro.
Este valor no suele respaldado por defecto y por ello resulta=20
imprescindible salvar las tablas con la opci=F3n adecuada (pg_dump -o).

Ambas t=E9cnicas evitan la aparici=F3n de claves duplicadas incluso cuando
se crean simultanemente nuevas claves de forma simultanea desde varios=20
usuarios. No sabr=EDa decir cuales son los pros y los contras de cada=20
t=E9cnica ya que ambas me parecen perfectas.



Un saludo

Antonio Castro

+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--=
+
        /\     /\      Ciberdroide Inform=E1tica (Tienda de Linux)
          \\W//            <<< http://www.ciberdroide.com >>>
=09 _|0 0|_                                                   =20
+-oOOO--(___o___)--OOOo----------------------------------------------------=
+=20
|  . . . . U U . . . . Antonio Castro Snurmacher  acastro@ciberdroide.com  =
| =20
|  . . . . . . . . . .                                                     =
|=20
+()()()----------()()()----------------------------------------------------=
+
| *** 1.700 sitios clasificados por temas sobre Linux en ***Donde_Linux*** =
|
| <<< http://www.ciberdroide.com/misc/donde/dondelinux.html >>>            =
|
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--=
+