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. <jaqu...@lexuseditores.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-ow...@postgresql.org > [mailto:pgsql-es-ayuda-ow...@postgresql.org] En nombre de nestor > Enviado el: martes, 13 de septiembre de 2011 04:30 p.m. > Para: pgsql-es-ayuda@postgresql.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@postgresql.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@postgresql.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@postgresql.org) Para cambiar tu suscripción: http://www.postgresql.org/mailpref/pgsql-es-ayuda