Re: MSSQL to PostgreSQL - Problema intentando generar ID de modo YYYYMMDD0000000X

From: Mariano Reingart <reingart(at)gmail(dot)com>
To: Ignacio Balcarce <ignacio(dot)balcarce(at)vivatia(dot)com>
Cc: Alvaro Herrera <alvherre(at)alvh(dot)no-ip(dot)org>, "pgsql-es-ayuda(at)postgresql(dot)org" <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: MSSQL to PostgreSQL - Problema intentando generar ID de modo YYYYMMDD0000000X
Date: 2010-04-06 23:17:02
Message-ID: k2y5aebd8251004061617s12bc64a4z352ba45304c3944f@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Para el to_char:

INSERT INTO thuban_seq(seq_id) VALUES (to_char(now(),'YYYYMMDD') ||
to_char(id+1,'00000000'))) RETURNING seq_id INTO item_id;

Y para evitar los posibles problemas como recomienda Alvaro (si
entendí bien, que varios usuarios compitan por el mismo ID, que
igualmente te daría error al insertar por ser duplicado), me parece
que tendrías que poner al principio un:

LOCK TABLE thuban_seq;

lo que bloquearía esta función si hay otro usuario concurrente (y
tendrías que hacerlo al principio de la transacción, posiblemente en
el nivel de aislamiento SERIALIZABLE).

El problema es que bloquearías también cualquier otra operación sobre
la tabla (hasta que termine la transacción), con la probable pérdida
de rendimiento.

¿No podés usar secuencias automáticas de PostgreSQL (tipo de datos
serial)?, sería más fácil y no tendrías estos problemas.

Sds

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

2010/4/6 Ignacio Balcarce <ignacio(dot)balcarce(at)vivatia(dot)com>:
> Como podría optimizar y mejorar esta función?
>
> Soy nuevo en postgre y realmente me esta costando esto, por donde puedo ver?
>
> Que cambios les harías y porque crees q tengo el error y como lo
> corregirías?
>
> Ignacio
>
> El Apr 6, 2010, a las 18:27, Alvaro Herrera <alvherre(at)alvh(dot)no-ip(dot)org>
> escribió:
>
>> Ignacio Balcarce escribió:
>>
>>> BEGIN
>>>               IF (SELECT max(seq_id) FROM thuban_seq
>>>                   WHERE seq_id LIKE (to_char(now() + '1 day'::interval,
>>> 'YYYYMMDD') || '%')) IS NOT NULL
>>>
>>>                              THEN
>>>                                              SELECT max(seq_id) INTO
>>> item_id
>>>                                              FROM thuban_seq
>>>                                              WHERE seq_id LIKE
>>> (to_char(now() + '1 day'::interval, 'YYYYMMDD') || '%');
>>>
>>>                                              id := substr(item_id, 9,
>>> length(item_id)-9)::INT8;
>>>
>>>               ELSE
>>>                                              id:= 00000000;
>>>               END IF;
>>>
>>>  INSERT INTO thuban_seq(seq_id) VALUES (to_char(now(),'YYYYMMDD') ||
>>> (id+1)) RETURNING seq_id INTO item_id;
>>
>>
>> Espero que tengas algún lock externamente a la ejecución de esta
>> función, porque así como está es sujeto de condiciones de carrera.
>>
>> --
>> Alvaro Herrera
>> http://www.amazon.com/gp/registry/DXLWNGRJD34J
>> "I'm always right, but sometimes I'm more right than other times."
>>                                                 (Linus Torvalds)
>

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Ignacio Balcarce 2010-04-06 23:32:33 Re: MSSQL to PostgreSQL - Problema intentando generar ID de modo YYYYMMDD0000000X
Previous Message Alvaro Herrera 2010-04-06 22:36:44 Re: Es posible recuperar una base de datos después de hacer "drop database"?