Schlüssel-Überlauf? Generated Value (Hibernate)

Guten Tag,
ich habe ein Web-Tool (Java, Hibernate) und dieses schreibt Datensätze in eine postgreSQL-DB mit Key-GeneratedValue (Hibernate) bzw. AutoIncrement.
Es sind immer ca. 20’000 Datensätze eingetragen, die aber laufend ausgewechselt werden: alte werden gelöscht und neue kommen hinzu.
Irgendwann läuft der Schlüssel in die oberen, maximalen Ränge und ich frage mich, wie das “GeneratedValue” dann funktioniert.
Werden die “alten” wieder freien Werte generiert und gibt es also damit nie einen Konflikt?
Vielen Dank für einen Hinweis.
Beste Grüsse, liliho

Postgresql nutzt dazu Sequencen. Diese kann man sich anschauen:

test=# create table demo(id serial);
CREATE TABLE
test=*# \d demo;
                         Table "public.demo"
 Column |  Type   |                     Modifiers
--------+---------+---------------------------------------------------
 id     | integer | not null default nextval('demo_id_seq'::regclass)

test=*# select * from demo_id_seq;
 sequence_name | last_value | start_value | increment_by |      max_value      | min_value | cache_value | log_cnt | is_cycled | is_called
---------------+------------+-------------+--------------+---------------------+-----------+-------------+---------+-----------+-----------
 demo_id_seq   |          1 |           1 |            1 | 9223372036854775807 |         1 |           1 |       0 | f         | f
(1 row)

Da gehen also 9223372036854775807 Einträge. Dann wird is_cycled geprüft - das steht auf FALSE. Was dann passiert kann man testen:

test=# create sequence demo maxvalue 3 no cycle;
CREATE SEQUENCE
test=*# select nextval('demo');
 nextval
---------
       1
(1 row)

test=*# select nextval('demo');
 nextval
---------
       2
(1 row)

test=*# select nextval('demo');
 nextval
---------
       3
(1 row)

test=*# select nextval('demo');
ERROR:  nextval: reached maximum value of sequence "demo" (3)
STATEMENT:  select nextval('demo');
ERROR:  nextval: reached maximum value of sequence "demo" (3)

Du kannst auf CYCLE umstellen (wie, das steht in der Doku), mußt dann aber damit rechnen:

test=# create sequence demo maxvalue 3 cycle;
CREATE SEQUENCE
test=*# create table dem_tab(id int default nextval('demo') primary key);
CREATE TABLE
test=*# insert into dem_tab values (default);
INSERT 0 1
test=*# insert into dem_tab values (default);
INSERT 0 1
test=*# insert into dem_tab values (default);
INSERT 0 1
test=*# insert into dem_tab values (default);
ERROR:  duplicate key value violates unique constraint "dem_tab_pkey"
DETAIL:  Key (id)=(1) already exists.
STATEMENT:  insert into dem_tab values (default);
ERROR:  duplicate key value violates unique constraint "dem_tab_pkey"
DETAIL:  Key (id)=(1) already exists.

Andreas