Re: Como evitar que postgrest genere series con "huecos"

From: Mariano Reingart <reingart(at)gmail(dot)com>
To: "Javier Aquino H(dot)" <JAquino(at)lexuseditores(dot)com>
Cc: nestor <nestor(dot)njrz(at)gmail(dot)com>, pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: Como evitar que postgrest genere series con "huecos"
Date: 2011-09-13 22:25:21
Message-ID: CAPyeU7SgpQO0O-xOXp1buAS+GPuuZT+E=_RNos2-zF43O0sw0A@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Para tener un campo ID que no tenga huecos no se puede usar SERIAL tal
como viene, si no me equivoco una solución sería bloquear la tabla y
buscar el mayor valor clave:

reingart=# create table public.tutabla (campo_id integer PRIMARY
KEY);NOTICE: CREATE TABLE / PRIMARY KEY creará el índice implícito
«tutabla_pkey» para la tabla «tutabla»
CREATE TABLE
reingart=# begin;
BEGIN
reingart=# lock table tutabla;

reingart=# INSERT INTO tutabla(campo_id) SELECT MAX(campo_id)+1 FROM
tutabla RETURNING campo_id;

reingart=# INSERT INTO tutabla(campo_id) SELECT
COALESCE(MAX(campo_id)+1, 1) FROM tutabla RETURNING campo_id;
campo_id
----------
1
(1 fila)

INSERT 0 1
reingart=#
reingart=# commit;
COMMIT

Si bien vas a tener un id correlativo, otros usuarios no van a poder
hacer nada con la tabla (consultar ni insertar, etc) mientras este
insertando, porque sino el MAX(campo_id) no seria coherente.

Calculo que podrías ponerlo en una función para poder usarlo como dato
predeterminado DEFAUL al crear la tabla.

Sds

Mariano Reingart
http://www.sistemasagiles.com.ar
http://reingart.blogspot.com

2011/9/13 Javier Aquino H. <JAquino(at)lexuseditores(dot)com>:
> Mejor usa una tabla para controlar tus correlativos ya que este tipo de
> numeración debe ser transaccional, en otras palabras debe revertirse si hay
> un rollback.
>
> Slds,
>
> Javier.
>
>
> -----Mensaje original-----
> De: pgsql-es-ayuda-owner(at)postgresql(dot)org
> [mailto:pgsql-es-ayuda-owner(at)postgresql(dot)org] En nombre de nestor
> Enviado el: martes, 13 de septiembre de 2011 04:30 p.m.
> Para: pgsql-es-ayuda(at)postgresql(dot)org
> Asunto: [pgsql-es-ayuda] Como evitar que postgrest genere series con
> "huecos"
>
> Que tal amigos de postgrest!
> Aqui estoy peleandome con las secuencias de postgrest, lo que quiero
> hacer es evitar que postgres "pierda" o "saltee" secuencias, por ejemplo
> me pasa que de la secuencia 2250 pasa a la 2259.
>
> Estoy intentando modificar la secuencia y verificar que no ocurra dicho
> "salto" con ul procedimiento almacenado como este:
> CREATE OR REPLACE FUNCTION lux.tri_bi_reclamos()
>   RETURNS "trigger" AS
> $BODY$
> DECLARE
> max_reclamo_id bigint not null;
> icurrval bigint not null;
> setvalreturn bigint not null;
> BEGIN
>   begin
>     select max(reclamo_id) into max_reclamo_id
>         from lux.reclamos;
>         raise notice 'max_reclamo_id = %', max_reclamo_id;
>
>     select currval('lux.reclamos_reclamo_id_seq') into icurrval;
>
>     if (max_reclamo_id != icurrval) then
>         SELECT setval('lux.reclamos_reclamo_id_seq', max_reclamo_id +
> 1) into setvalreturn;
>     end if;
>
>     return new;
>   exception
>     when others then
>       raise exception 'tri_bi_reclamos: (%)', SQLERRM;
>   end;
> END;$BODY$
>   LANGUAGE 'plpgsql' VOLATILE;
>
> Pero los errores que da me pierden mas y ya no se que hacer.
>
> Si alguien tubo un problema como este le agradeceria mucho me mostrara
> como hacer, porque estoy usando el campo serial para darle numero a
> reclamos, pero como saltea los numeros no esta sirviendo porque el
> cliente quiere que sean si o si consecutivos sin ningun "salto" en la serie.
>
> Desde ya gracias a la comunidad por su tiempo.
>
> Atte.
> Nestor Rodriguez
> -
> Enviado a la lista de correo pgsql-es-ayuda (pgsql-es-ayuda(at)postgresql(dot)org)
> Para cambiar tu suscripción:
> http://www.postgresql.org/mailpref/pgsql-es-ayuda
>
> -
> Enviado a la lista de correo pgsql-es-ayuda (pgsql-es-ayuda(at)postgresql(dot)org)
> Para cambiar tu suscripción:
> http://www.postgresql.org/mailpref/pgsql-es-ayuda
>

In response to

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Juan Pablo Santiago de Chile CEI 2011-09-13 22:27:52 RE: Mezclar datos + esquemas en otro server
Previous Message Juan 2011-09-13 22:07:40 Re: Mezclar datos + esquemas en otro server