Thread: Skipping numbers in a sequence.

Skipping numbers in a sequence.

From
GH
Date:
Hello all.

It's like this. ;-)

I have a table with a column that has a default nextval('sequence').
The sequence is a standard increment 1 cycle sequence.

What happens when
    the sequence wraps after inserting the
        2-million-and-whatever-th row
    some of the earlier
        rows (say, 1-100) are still in the table
    but other rows or sections (say, 101-110 and 120-125) have
        been deleted
and I need to begin with the first un-used sequence number?

I suppose that I would need to find the first un-used sequence number,
use setval() to update the sequence, and then insert the row that needs
to be insert-ed. Well, how can I find the first un-used sequence number?
I thought about doing something using a function like
    select sequence_column from table
    NOT [the set of numbers that make up the sequence]
but, how do I select the set of numbers that make up the sequence?

Is there a better/cleaner/easier way of getting the end result?

Postgres 7.0.2 (should be running .3, *sigh*)
FreeBSD 4.1-RELEASE
PHP 4.0.3pl1

Thanks fellas (and ladies, if applicable).

gh


Re: Skipping numbers in a sequence.

From
GH
Date:
On Fri, Nov 24, 2000 at 09:59:17PM +1300, some SMTP stream spewed forth:
> GH wrote:
> > Hello all.
> > It's like this. ;-)
> > I have a table with a column that has a default nextval('sequence').
> > The sequence is a standard increment 1 cycle sequence.
> > What happens when
> >         the sequence wraps after inserting the
> >                 2-million-and-whatever-th row
> >         some of the earlier
> >                 rows (say, 1-100) are still in the table
> >         but other rows or sections (say, 101-110 and 120-125) have
> >                 been deleted
> > and I need to begin with the first un-used sequence number?
>
> This sort of shit is to be avoided at all costs!  Its going to all be
> horribly inefficient, really. :-)
>
> I usually leave the sequence to error at 4 billion, and if that hits me
> before the heat-death of the universe I will sort it out then :-)

I was thinking about something like that.
This table is used in such a way that each row corresponds to one item
in an order. So, I suppose I need to guesstimate the likely-hood that
a company would sell (or have-shopped) n items.

I just have that icky feeling that some day the sequence will roll over
and hell with come after my ass. ;-))

>
> You could add a trigger onto the table that implements the sequence,
> perhaps, to always set the nextval to something which is available, but
> this is icky.

---
>It would be easier to bite the bullet and write your own
> mynextval() function which found the first free value after the current
> "lastval", set "lastval" to that and handed it back for your new key.

I was hoping someone could guide me in the right direction as to going about
creating such a monster. How could I find the next free value? Would said
monster have to be written in something other than SQL, such as C?
---

At the moment, this sequence number serves no real purpose other
than providing something unique for each row. Perhaps I could
re-sequence the rows every once in a while? (That sounds like it
would be interesting...*I* am not even sure what I am thinking.)

The rows in this table will be relatively temporary, but must have some
column that is guaranteed unique for each row. That is the only reason
that I even have the sequence column.

Table in discussion:
key | order_num | item_id | quantity
 1  |  1234     |  abc123 |  12
 2  |  1234     |  12blah |   6
etc.,etc.

Thanks

gh


>
> Cheers,
>                     Andrew.
> --
> _____________________________________________________________________
>             Andrew McMillan, e-mail: Andrew@cat-it.co.nz
> Catalyst IT Ltd, PO Box 10-225, Level 22, 105 The Terrace, Wellington
> Me: +64 (21) 635 694, Fax: +64 (4) 499 5596, Office: +64 (4) 499 2267

Re: Skipping numbers in a sequence.

From
GH
Date:
On Fri, Nov 24, 2000 at 04:07:25AM -0600, some SMTP stream spewed forth:
> On Fri, Nov 24, 2000 at 09:59:17PM +1300, some SMTP stream spewed forth:
> > GH wrote:
> > > Hello all.
> > > It's like this. ;-)
> > > I have a table with a column that has a default nextval('sequence').
> > > The sequence is a standard increment 1 cycle sequence.
> > > What happens when
> > >         the sequence wraps after inserting the
> > >                 2-million-and-whatever-th row

*snippity snip snip*

> >
> > I usually leave the sequence to error at 4 billion, and if that hits me
> > before the heat-death of the universe I will sort it out then :-)

Hell, do you suppose I could just set the column to float8 and let the
sequence run for the next several years? I would be happy if the sequence
buys me 3 or more years. ;-)
(Just get me to Morrocco, baby. ;-))

There would not be any problems with a sequence as high as max(float8), would
there?

> I was thinking about something like that.
> This table is used in such a way that each row corresponds to one item
> in an order. So, I suppose I need to guesstimate the likely-hood that
> a company would sell (or have-shopped) n items.
>
> I just have that icky feeling that some day the sequence will roll over
> and hell with come after my ass. ;-))
>

Thanks.

gh

>
>
> >
> > Cheers,
> >                     Andrew.
> > --
> > _____________________________________________________________________
> >             Andrew McMillan, e-mail: Andrew@cat-it.co.nz
> > Catalyst IT Ltd, PO Box 10-225, Level 22, 105 The Terrace, Wellington
> > Me: +64 (21) 635 694, Fax: +64 (4) 499 5596, Office: +64 (4) 499 2267

Re: Skipping numbers in a sequence.

From
GH
Date:
On Fri, Nov 24, 2000 at 04:16:52AM -0600, some SMTP stream spewed forth:
> On Fri, Nov 24, 2000 at 04:07:25AM -0600, some SMTP stream spewed forth:
> > On Fri, Nov 24, 2000 at 09:59:17PM +1300, some SMTP stream spewed forth:
> > > GH wrote:
> > > > Hello all.
> > > > It's like this. ;-)
> > > > I have a table with a column that has a default nextval('sequence').
> > > > The sequence is a standard increment 1 cycle sequence.
> > > > What happens when
> > > >         the sequence wraps after inserting the
> > > >                 2-million-and-whatever-th row
>
> *snippity snip snip*
>
> > >
> > > I usually leave the sequence to error at 4 billion, and if that hits me
> > > before the heat-death of the universe I will sort it out then :-)
>
> Hell, do you suppose I could just set the column to float8 and let the
> sequence run for the next several years? I would be happy if the sequence
> buys me 3 or more years. ;-)
> (Just get me to Morrocco, baby. ;-))
>
> There would not be any problems with a sequence as high as max(float8), would
> there?

Er, to answer my own question, yes.
I seem to have discovered that the maximum maxvalue for a sequence is
9,999,999,999 (i.e. 10 digits) -- which leads one to believe that 10 is
the max num of digits for an integer-type column.

gh

>
> > I was thinking about something like that.
> > This table is used in such a way that each row corresponds to one item
> > in an order. So, I suppose I need to guesstimate the likely-hood that
> > a company would sell (or have-shopped) n items.
> >
> > I just have that icky feeling that some day the sequence will roll over
> > and hell with come after my ass. ;-))
> >
>
> Thanks.
>
> gh
>
> >
> >
> > >
> > > Cheers,
> > >                     Andrew.
> > > --
> > > _____________________________________________________________________
> > >             Andrew McMillan, e-mail: Andrew@cat-it.co.nz
> > > Catalyst IT Ltd, PO Box 10-225, Level 22, 105 The Terrace, Wellington
> > > Me: +64 (21) 635 694, Fax: +64 (4) 499 5596, Office: +64 (4) 499 2267

Re: Skipping numbers in a sequence.

From
GH
Date:
>
> Er, to answer my own question, yes.
> I seem to have discovered that the maximum maxvalue for a sequence is
> 9,999,999,999 (i.e. 10 digits) -- which leads one to believe that 10 is
> the max num of digits for an integer-type column.
[Must...stop...coding...while...asleep...and....braindead.]

The max for maxvalue is the max(integer) which I believe is 2147483647.

gh

>
> gh
>
> >
> > > I was thinking about something like that.
> > > This table is used in such a way that each row corresponds to one item
> > > in an order. So, I suppose I need to guesstimate the likely-hood that
> > > a company would sell (or have-shopped) n items.
> > >
> > > I just have that icky feeling that some day the sequence will roll over
> > > and hell with come after my ass. ;-))
> > >
> >
> > Thanks.
> >
> > gh
> >
> > >
> > >
> > > >
> > > > Cheers,
> > > >                     Andrew.
> > > > --
> > > > _____________________________________________________________________
> > > >             Andrew McMillan, e-mail: Andrew@cat-it.co.nz
> > > > Catalyst IT Ltd, PO Box 10-225, Level 22, 105 The Terrace, Wellington
> > > > Me: +64 (21) 635 694, Fax: +64 (4) 499 5596, Office: +64 (4) 499 2267

Re: [GENERAL] Skipping numbers in a sequence.

From
Robert Boyd
Date:
Try a dump of your database using pg_dump.  4294967296 is the maxval if I
remember correctly.  32 bit integers are a good thing.  Your question
still holds, what is the condition of overflow after maxval has been
reached.

Typically, you want to use a sequence like this for a unique opaque
indentifier (read: primary key) field in your db table schema.  It's
probably not a good idea to reuse these, even if it is possible.  One
thing you can do to ensure your data is not overwritten is to build a
unique constraint into the field (I think PostgreSQL expands this as a
trigger).

As far as trying to pick the first "hole" out of a set of numbers, that's
an interesting question.  Or maybe it isn't.  It makes me question your
schema design if you have to do off-the-wall things like that.  In any
case, remember that you can't select something that's not there.  Again,
question why it is that you're trying to do what you are :)

Hope this is of some help.

- Rob


On Thu, 23 Nov 2000, GH wrote:

> Hello all.
>
> It's like this. ;-)
>
> I have a table with a column that has a default nextval('sequence').
> The sequence is a standard increment 1 cycle sequence.
>
> What happens when
>     the sequence wraps after inserting the
>         2-million-and-whatever-th row
>     some of the earlier
>         rows (say, 1-100) are still in the table
>     but other rows or sections (say, 101-110 and 120-125) have
>         been deleted
> and I need to begin with the first un-used sequence number?
>
> I suppose that I would need to find the first un-used sequence number,
> use setval() to update the sequence, and then insert the row that needs
> to be insert-ed. Well, how can I find the first un-used sequence number?
> I thought about doing something using a function like
>     select sequence_column from table
>     NOT [the set of numbers that make up the sequence]
> but, how do I select the set of numbers that make up the sequence?
>
> Is there a better/cleaner/easier way of getting the end result?
>
> Postgres 7.0.2 (should be running .3, *sigh*)
> FreeBSD 4.1-RELEASE
> PHP 4.0.3pl1
>
> Thanks fellas (and ladies, if applicable).
>
> gh
>


Re: Skipping numbers in a sequence.

From
ghaverla@freenet.edmonton.ab.ca
Date:
On Fri, 24 Nov 2000, GH wrote:
> On Fri, Nov 24, 2000 at 04:07:25AM -0600, some SMTP stream spewed forth:
> > On Fri, Nov 24, 2000 at 09:59:17PM +1300, some SMTP stream spewed forth:
> > > GH wrote:
> > > > Hello all.
> > > > It's like this. ;-)
> > > > I have a table with a column that has a default nextval('sequence').
> > > > The sequence is a standard increment 1 cycle sequence.
> > > > What happens when
> > > >         the sequence wraps after inserting the
> > > >                 2-million-and-whatever-th row
>
> *snippity snip snip*

> > > I usually leave the sequence to error at 4 billion, and if that hits me
> > > before the heat-death of the universe I will sort it out then :-)
>
> Hell, do you suppose I could just set the column to float8 and let the
> sequence run for the next several years? I would be happy if the sequence
> buys me 3 or more years. ;-)
> (Just get me to Morrocco, baby. ;-))
>
> There would not be any problems with a sequence as high as max(float8), would
> there?

What happens when you try to increment by 1, a number stored in
a float 8 which is (much) bigger than MAXVAL, but still smaller than
what a float 8 can hold?  Absolutely nothing.  A numerical test
of equality shows the 2 numbers are equal.  You have to stick with
some kind of integer, but it will have to be spread across multiple
words.  If int4 isn't big enough, int6 (your home-made int 6 that
is) would probably be big enough.  If heat death really bothers
you, try int 8.  There should be stuff in the GNU multi-precision
library or perl (bit vectors I think) which would let you write
this sort of stuff.

Gord

Matter Realisations     http://www.materialisations.com/
Gordon Haverland, B.Sc. M.Eng. President
101  9504 182 St. NW    Edmonton, AB, CA  T5T 3A7
780/481-8019            ghaverla @ freenet.edmonton.ab.ca
780/993-1274 (cell)



Re: Skipping numbers in a sequence.

From
Tom Lane
Date:
GH <grasshacker@over-yonder.net> writes:
> I just have that icky feeling that some day the sequence will roll over
> and hell with come after my ass. ;-))

At some point someone will doubtless get around to supporting sequences
based on int8 rather than int4 values.  Relying on that to happen before
you need it seems like a better answer than inventing slow,
hard-to-understand schemes for recycling sequence values.

            regards, tom lane

Re: Skipping numbers in a sequence.

From
Andrew McMillan
Date:
GH wrote:
>
> >
> > Er, to answer my own question, yes.
> > I seem to have discovered that the maximum maxvalue for a sequence is
> > 9,999,999,999 (i.e. 10 digits) -- which leads one to believe that 10 is
> > the max num of digits for an integer-type column.
> [Must...stop...coding...while...asleep...and....braindead.]
>
> The max for maxvalue is the max(integer) which I believe is 2147483647.

So if you stick with the current standard, you can create ten per second
for the next 6.8 years before you have to worry.

I think that by then PostgreSQL will have INT8 sequences, or you will
have learned enough to implement them yourself :-)

Regards,
                    Andrew.
--
_____________________________________________________________________
            Andrew McMillan, e-mail: Andrew@cat-it.co.nz
Catalyst IT Ltd, PO Box 10-225, Level 22, 105 The Terrace, Wellington
Me: +64 (21) 635 694, Fax: +64 (4) 499 5596, Office: +64 (4) 499 2267

Re: Skipping numbers in a sequence.

From
GH
Date:
On Sun, Nov 26, 2000 at 11:33:39PM +1300, some SMTP stream spewed forth:
> GH wrote:
> >
> > >
> > > Er, to answer my own question, yes.
> > > I seem to have discovered that the maximum maxvalue for a sequence is
> > > 9,999,999,999 (i.e. 10 digits) -- which leads one to believe that 10 is
> > > the max num of digits for an integer-type column.
> > [Must...stop...coding...while...asleep...and....braindead.]
> >
> > The max for maxvalue is the max(integer) which I believe is 2147483647.
>
> So if you stick with the current standard, you can create ten per second
> for the next 6.8 years before you have to worry.

Bu...bu...but, *that's not the /point/*! ;-))

heh.
I hate it when my noble efforts are shot down by realism and sensible
thinking. ;-)

The truly funny thing about it all is that I have since dropped the whole
bloody column from the table. Who needs a single unique column, anyway?
The sad truth is that I need to re-do a large part of the schema using
foreign keys and some other things.


Thanks for all your efforts.

gh


> I think that by then PostgreSQL will have INT8 sequences, or you will
> have learned enough to implement them yourself :-)
>
> Regards,
>                     Andrew.
> --
> _____________________________________________________________________
>             Andrew McMillan, e-mail: Andrew@cat-it.co.nz
> Catalyst IT Ltd, PO Box 10-225, Level 22, 105 The Terrace, Wellington
> Me: +64 (21) 635 694, Fax: +64 (4) 499 5596, Office: +64 (4) 499 2267