Wie kann ich den
zuletzt zugewiesenen Wert des Feldes "Auto-Increment" des seriellen Typs in die andere PostgreSQL-Datenbank übertragen, wenn die Tabelle Löschungen enthalten könnte und "nur noch max (pk)" nicht mehr funktioniert?
Es ist nur wenigen bekannt, dass PG zwar nicht über
Funktionen der Version 10 verfügt
, um den letzten Wert einer Sequenz für ein solches Feld
aus einer anderen Sitzung herauszufinden , dies jedoch dennoch möglich ist.

PostgreSQL unterstützt "Auto-Inkrement" -Felder, die durch den
seriellen Pseudotyp definiert sind :
Die Datentypen "smallserial", "serial" und "bigserial" sind keine reellen Typen, sondern lediglich ein praktisches Tool zum Erstellen von Spalten mit eindeutigen Bezeichnern (ähnlich der AUTO_INCREMENT-Eigenschaft in einigen DBMS).
Technisch gesehen ist dies nur eine automatische Verknüpfung der DEFAULT-Definition für das Feld und der vom
SEQUENCE- Objekt generierten Werte. Und manchmal möchte ich diese Werte untersuchen - zum Beispiel,
um sie in eine Datenbank mit ähnlicher Struktur zu übertragen .
Dies ist jedoch nicht einfach:
currval
Gibt den Wert zurück, der vom letzten nextval-Aufruf für diese Sequenz in der aktuellen Sitzung zurückgegeben wurde. (Wenn nextval in einer bestimmten Sitzung noch nie für eine bestimmte Sequenz aufgerufen wurde, wird ein Fehler zurückgegeben.) Da dieser Wert durch den Umfang der Sitzung begrenzt ist, liefert diese Funktion ein vorhersagbares Ergebnis, unabhängig davon, ob nextval später in anderen Sitzungen aufgerufen wurde oder nicht.
Pg_sequences-SystemansichtAb PostgreSQL 10 erschien die
Systemansicht pg_sequences , in der diese Informationen bereits ohne großen Aufwand sichtbar sind.
Versuchen wir doch diese Informationen herauszuholen:
CREATE TABLE tst( id serial
TABLE tst;
id | val -------- 1 | 1 2 | 2 3 | 4 4 | 8
Dies ist der Wert
id = 4
, den wir erhalten möchten. Aber jemand hat einen Teil der Datensätze gelöscht, und in der Tabelle ist es nicht mehr:
DELETE FROM tst WHERE id > 2;
id | val -------- 1 | 1 2 | 2
Zuerst ermitteln wir den Namen der Sequenz, die unserem Feld entspricht:
SELECT pg_get_serial_sequence('tst', 'id');
pg_get_serial_sequence ---------------------- public.tst_id_seq
Verwenden Sie nun den resultierenden
Sequenznamen als Tabelle in der Abfrage:
SELECT * FROM public.tst_id_seq;
last_value | log_cnt | is_called -------------------------------- 4 | 29 | t
Tatsächlich speichert das
last_value- Feld auch den allerletzten Wert, den die Sequenz zum Zeitpunkt unseres Aufrufs generiert hat.
Erstellen wir nun ein einfaches Skript zum Übertragen von Sequenzwerten von einer Datenbank in eine andere mit
dem Modul dblink :
Denken Sie jedoch daran, dass das Ergebnis undefiniert ist, wenn eine Aktivität in der Quellbasis vorhanden ist!