Aktueller Wert der Sequenz

Hallo zusammen,

ich muß hier nochmal ein Thema zur Diskussion stellen, zu dem schon viel gefragt und gesagt wurde:

Wie erhalte ich den aktuellen Wert einer Sequenz? (bei mir unter 8.3) Atomizität ist mir dabei nicht wichtig.

Bitte keine RTFM-Antworten, das habe ich schon getan. Während es (wohl) unter Postgres 8.0 noch die Möglichkeit gab, ohne vorherige Benutzung von nextval() in derselben Session den aktuellen Wert der Sequenz auszulesen (sofern keine Transaktion gestartet wurde), geht das inzwischen nicht mehr. Ich brauche jedoch den aktuellen Wert, ohne zuvor den Wert der Sequenz zu inkrementieren.

Hintergrund meiner Frage ist, daß ich ich speziellen Fällen bei INSERTs einen “duplicate PK”-error bekomme, obwohl der laut pgAdmin III zuvor angezeigte aktuelle Sequenzwert identisch mit dem höchsten PK war. Wie macht z.B. pgAdmin III das? Gibt es irgendwelche Systemtabellen, wo der aktuelle Wert gespeichert wird.

Nein.

apache:~ # psql -U sgt test
Welcome to psql, the PostgreSQL interactive terminal.

Type:  \copyright for distribution terms
       \h for help with SQL commands
       \? for help on internal slash commands
       \g or terminate with semicolon to execute query
       \q to quit

test=> select currval('foo_seq');
ERROR:  foo_seq.currval is not yet defined in this session
test=> select version();
                            version
---------------------------------------------------------------
 PostgreSQL 7.2.1 on i686-pc-linux-gnu, compiled by GCC 2.95.3
(1 row)

Das ist ein Museums-Rechner :wink:

Hintergrund meiner Frage ist, daß ich ich speziellen Fällen bei INSERTs einen “duplicate PK”-error bekomme, obwohl der laut pgAdmin III zuvor angezeigte aktuelle Sequenzwert identisch mit dem höchsten PK war. Wie macht z.B. pgAdmin III das? Gibt es irgendwelche Systemtabellen, wo der aktuelle Wert gespeichert wird.

Einse Sequence IST eine Tabelle mit nur einer Zeile, Du kannst die Spalten abfragen. Für obiges Museumsstücke:

test=> select * from foo_seq;
 sequence_name | last_value | increment_by |      max_value      | min_value | cache_value | log_cnt | is_cycled | is_called
---------------+------------+--------------+---------------------+-----------+-------------+---------+-----------+-----------
 foo_seq       |          2 |            1 | 9223372036854775807 |         1 |           1 |      32 | f         | t
(1 row)

Andreas

Oh, das ist mir jetzt aber etwas peinlich. Sooooo einfach!? Und es steht tatsächlich auch im Manual, allerdings in der Dokumentation zu CREATE SEQUENCE.

PostgreSQL: Documentation: Manuals: PostgreSQL 8.3: CREATE SEQUENCE

Vielen Dank, Andreas!

7.2 ist schon eine ganze Weile nicht mehr supported. Wo hast du denn den aufgetrieben? Das muss ja schon knapp 10 Jahre alt sein.

Ja nett, oder?

Andreas