Skip site navigation (1) Skip section navigation (2)

finding (and recycling) holes in sequences

From: Kyle Bateman <kyle(at)actarg(dot)com>
To: pgsql-sql(at)postgresql(dot)org
Cc: ldm(at)apartia(dot)ch
Subject: finding (and recycling) holes in sequences
Date: 2000-06-26 15:35:48
Message-ID: 39577854.138C7E2C@actarg.com (view raw or flat)
Thread:
Lists: pgsql-sql
>
> If one has a unique-id generating sequence that sometimes is bound to
> have holes in it (ie: it could happen that a nextval(seq) happens
> without a corresponding INSERT in the table), then how could one
> efficiently scan for these holes to recycle them in subsequent INSERTs?
>
> I'm just looking for a "standard" way of doing this if such a thing
> exists.
>
> Louis-David Mitterrand - ldm(at)apartia(dot)org - http://www.apartia.fr
>

If you want to create a sequence of numbers with no holes, you might consider NOT using sequences at all (the are really meant for something
different).  Rather, each time you wish to do an insert, query the existing data to see what the maximum value is existing in the database.  Add 1 to
that and use this as your new value.  This is guaranteed to not have any holes in the sequence.  To make inserts easier, you can define an sql function
that will return the max value.  Here's an example:

create function maxid () returns int4 as '
    declare
        mv int4;
    begin
        select max(id) into mv from mytab;
        if mv is null then return 0; end if;
        return mv;
    end;
' language 'plpgsql';

create table mytab (
    id int4 primary key default (maxid() + 1),
    data text
);

insert into mytab (data) values ('Hi there');
insert into mytab (data) values ('Howdy');
insert into mytab (data) values ('Guten Tag');
insert into mytab (data) values ('Terve');

select * from mytab;



BTW hackers, this is a common enough request, I wonder if there should be a built-in feature to make it easier for people to put this into the default
value in the table definition i.e.:

create table mytab (
    keycolumn int4 primary key default coalesce(max(keycolumn),0)+1,
    data text
);

Wouldn't this eliminate the need for rollback-able sequences?


Attachment: kyle.vcf
Description: text/x-vcard (291 bytes)

Responses

pgsql-sql by date

Next:From: Bryan WhiteDate: 2000-06-26 16:36:31
Subject: A subselect in an aggregate
Previous:From: Thomas LockhartDate: 2000-06-26 04:11:26
Subject: Re: JOIN syntax

Privacy Policy | About PostgreSQL
Copyright © 1996-2014 The PostgreSQL Global Development Group