Re: [Pgsql-ayuda] Incremento por defecto

From: Antonio Castro <acastro(at)ciberdroide(dot)com>
To: Daniel Escobar <desco001(at)pinhue(dot)ufro(dot)cl>
Cc: pgsql-ayuda(at)tlali(dot)iztacala(dot)unam(dot)mx
Subject: Re: [Pgsql-ayuda] Incremento por defecto
Date: 2002-03-17 08:26:50
Message-ID: Pine.LNX.4.21.0203170848170.801-100000@midas.ciberdroide.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

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
corrija si cometo algún error.

Para lo que tu preguntas lo más común es usar un contador de secuencia.

test=> CREATE SEQUENCE contador1 ;

Este objeto tiene asociado unas funciones.

test=> SELECT curval('contador1') ; -- Para obtener el valor actual
test=> SELECT nextval('contador1') ; -- Para obtener el siguiente valor
test=> 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 (
clave int4 DEFAULT nextval('contador1') NOT NULL ,
....
PRIMARY KEY (clave)) ;

En la clausula de inserción para la 'tabla_ejemplo' tendrías que omitir
el campo 'clave' para que tome el valor por defecto.

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

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

En la prática existe otra técnica para obtener claves únicas sin tener 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
habría que hacer SELECT oid, * FROM tabla ; para que aparezca.

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

Ambas técnicas evitan la aparición de claves duplicadas incluso cuando
se crean simultanemente nuevas claves de forma simultanea desde varios
usuarios. No sabría decir cuales son los pros y los contras de cada
técnica ya que ambas me parecen perfectas.

Un saludo

Antonio Castro

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

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Manuel Sugawara 2002-03-17 22:56:31 Re: [Pgsql-ayuda] Consulta sobre create table
Previous Message pitu 2002-03-16 16:21:15 [Pgsql-ayuda] Consulta sobre create table