Обсуждение: Re: [GENERAL] Should SERIAL column have MAXVAL set on sequence
Moving to -bugs.
On Jul 23, 2007, at 9:02 AM, Woody Woodring wrote:
> I have a table in our DB that functions as a queue with a SERIAL
> column for
> its primary key. At 4am this weekend I started getting the error:
>
> ERROR: integer out of range
>
> Which was attributed to the sequence incrementing past the size of
> the int4
> serial column after several years of operation.
>
> I was able to set the sequence back to 1 and everything was happy.
>
> I was wondering if the SERIAL column should set the
> MAXVAL=2147483647 when
> it creates the sequence?
>
> I ended up fixing my queue table with the following to avoid the
> issue in
> the future:
>
> ALTER SEQUENCE transfer_transferid_seq MAXVALUE 2147483647 CYCLE;
I can confirm this is still the case in HEAD:
decibel=# select max_value from s_s_seq ;
max_value
---------------------
9223372036854775807
(1 row)
This does seem like a bug...
--
Jim Nasby jim@nasby.net
EnterpriseDB http://enterprisedb.com 512.569.9461 (cell)
Jim Nasby <decibel@decibel.org> writes:
> On Jul 23, 2007, at 9:02 AM, Woody Woodring wrote:
>> I ended up fixing my queue table with the following to avoid the
>> issue in the future:
>>
>> ALTER SEQUENCE transfer_transferid_seq MAXVALUE 2147483647 CYCLE;
> This does seem like a bug...
I see no bug here. Woody's proposal of making CYCLE be the default
behavior is absolutely, totally unacceptable for most applications:
serial columns are supposed to be unique, not wrap around and re-use old
ID values after awhile. That means we have to fail when the sequence
passes INT_MAX. I don't see a lot of reason to prefer failing with
"reached maximum value of sequence" to "integer out of range".
Furthermore, if we did stick a different MAXVALUE on the sequence for an
int4 column, we'd be buying into a bunch of other corner cases:
* do we change the MAXVALUE if you use ALTER COLUMN TYPE to switch
from int4 to int8 or vice versa?
* what if the same sequence is feeding multiple columns?
Right now, SERIAL just creates a sequence, and the user can adjust the
sequence parameters afterwards if he wants to. I think that behavior
is fine.
regards, tom lane
Jim Nasby =EDrta: > Moving to -bugs. > > On Jul 23, 2007, at 9:02 AM, Woody Woodring wrote: >> I have a table in our DB that functions as a queue with a SERIAL=20 >> column for >> its primary key. At 4am this weekend I started getting the error: >> >> ERROR: integer out of range >> >> Which was attributed to the sequence incrementing past the size of=20 >> the int4 >> serial column after several years of operation. >> >> I was able to set the sequence back to 1 and everything was happy. >> >> I was wondering if the SERIAL column should set the MAXVAL=3D2147483647= =20 >> when >> it creates the sequence? >> >> I ended up fixing my queue table with the following to avoid the=20 >> issue in >> the future: >> >> ALTER SEQUENCE transfer_transferid_seq MAXVALUE 2147483647 CYCLE; Did you already delete old records? Otherwise it will create duplicate=20 IDs... Alternatively you can alter the field to be BIGINT. > I can confirm this is still the case in HEAD: > > decibel=3D# select max_value from s_s_seq ; > max_value > --------------------- > 9223372036854775807 > (1 row) > > This does seem like a bug... No, it is by design. Nothing is stopping you from altering your sequence after creating your table with SERIALs. Anyway, [BIG]SERIAL is just a "macro" in PostgreSQL. BTW sequences were modified to produce BIGINT values some releases back. > --=20 > Jim Nasby jim@nasby.net > EnterpriseDB http://enterprisedb.com 512.569.9461 (cell) > > > > ---------------------------(end of broadcast)--------------------------- > TIP 6: explain analyze is your friend > Best regards, Zolt=E1n B=F6sz=F6rm=E9nyi --=20 ---------------------------------- Zolt=E1n B=F6sz=F6rm=E9nyi Cybertec Geschwinde & Sch=F6nig GmbH http://www.postgresql.at/