Re: como lograr campo consecutivo sin fallar ?

From: Gunnar Wolf <gwolf(at)gwolf(dot)org>
To: Alvaro Herrera <alvherre(at)alvh(dot)no-ip(dot)org>
Cc: Roberto Rodríguez Pino <rodpin(at)gmail(dot)com>, pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: como lograr campo consecutivo sin fallar ?
Date: 2008-07-22 05:32:39
Message-ID: 20080722053238.GC23960@cajita.gateway.2wire.net
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Alvaro Herrera dijo [Thu, Jul 17, 2008 at 01:33:41PM -0400]:
> Claro, pero para hacer una asignación numérica que "no falle" no puedes
> usar una secuencia. Tienes que bloquear la tabla y hacer la inserción
> del siguiente número disponible. Esto obviamente tiene menor
> rendimiento (solo puede haber un proceso insertando a la vez), pero te
> aseguras que no habrá agujeros en la numeración.
>
> Dado que la generación de facturas no es una cosa terriblemente
> frecuente, el menor rendimiento no debería ser un problema. Cada
> transacción debería tomar menos de un segundo de todas maneras. Un
> usuario que tiene que esperar un segundo más, no se da ni cuenta de la
> diferencia.

Pero incluso siendo este el caso, yo no usaría al número de factura
como la llave primaria. Generaría en todo caso algo como:

CREATE TABLE factura (
id SERIAL PRIMARY KEY,
factura integer NOT NULL DEFAULT siguiente_factura(),
otro_campo blah blah
);

Claro, poniendo la lógica en cuestión bajo siguiente_factura(), y
creándole un bonito índice para el rendimiento. Sí, sé que el número
de factura no _debe_ cambiar, pero... Bueno, todos los atributos que
un humano pueda tocar son malas opciones para una llave primaria. Y no
sé cómo sea en sus países, pero en México tú no puedes imprimir el
número de factura - tiene que venir pre-impreso por un impresor
autorizado. Eso sólo significa que el número de factura se tiene que
capturar una vez teniendo el papelito impreso (o listo en la
impresora).

Saludos,

--
Gunnar Wolf - gwolf(at)gwolf(dot)org - (+52-55)5623-0154 / 1451-2244
PGP key 1024D/8BB527AF 2001-10-23
Fingerprint: 0C79 D2D1 2C4E 9CE4 5973 F800 D80E F35A 8BB5 27AF

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message mAyErLiNg .M. 2008-07-22 14:42:18 Tabla temporal
Previous Message Jaime Casanova 2008-07-22 04:11:06 Re: RE: [pgsql-es-ayuda] Indice autonumérico