2013-08-14 16 views
6

ich eine einfache Frage habe, nehmen wir an einen Tisch haben:PostgreSQL - nächste fortlaufende Nummer in einer Tabelle

id A B 
1 Jon Doe 
2 Foo Bar 

Gibt es eine Möglichkeit zu wissen, was die nächsten ids Schritt ist, in diesem Fall 3? Datenbank ist PostgreSQL!

Tnx viel!

+0

werfen Sie einen Blick auf die nextval-Methode: http://www.postgresql.org/docs/8.1/static/functions-sequence.html –

+2

In der Tat kann es alles über 'MAX (id) FROM the_table auswählen) ** Warum willst du es wissen? – wildplasser

+0

Nun, ich mache ON DUPLICATE KEY-Emulation von MySQL .. es funktioniert wie folgt: php überprüft, ob wir eine ID in Objekt haben, das wir speichern möchten, wenn ja, dann okay, wenn nein, von db nächste ID, danach 'ON DUPLICATE KEY' Abfrage führt – Adrian

Antwort

11

Wenn Sie eine ID-Anspruch wollen und schicken Sie es, können Sie nextval() verwenden, die die Folge, ohne Daten einzufügen.

Beachten Sie, dass, wenn dies eine SERIAL Spalte ist, müssen Sie die Reihenfolge der Namen auf der Tabellen- und Spaltennamen basiert finden, wie folgt:

Select nextval(pg_get_serial_sequence('my_table', 'id')) as new_id; 

Es gibt keine gusseiserne Garantie von dem, was diese IDs bestellen kommt zurück (weil mehrere Sitzungen eine ID beanspruchen können und sie noch nicht verwenden oder sogar eine INSERT zurücksetzen), aber es gibt eine Garantie, dass sie eindeutig sein werden, was normalerweise wichtig ist.

Wenn Sie dies oft tun, ohne die ID tatsächlich zu verwenden, werden Sie eventuell alle möglichen Werte der Spalte verbrauchen (dh die maximal darstellbare Ganzzahl erreichen), aber wenn Sie es nur verwenden, wenn es eine hohe Wahrscheinlichkeit gibt Wenn Sie eine Zeile mit dieser ID einfügen, sollte es OK sein.

+0

Sehr gut geschrieben, leicht zu verstehen, markiert Ihre Antwort :) – Adrian

2

SELECT currval('names_id_seq') + 1;

die jedoch docs

See, natürlich gibt es keine Garantie, dass es Ihre nächsten Wert sein wird. Was ist, wenn ein anderer Kunde es vor Ihnen ergreift? Sie können jedoch einen der nächsten Werte für sich selbst reservieren, indem Sie eine nextval aus der Sequenz auswählen.

+0

Meinst du 'CURRVAL'? ? Afaik, es wird erst gesetzt, wenn die aktuelle Sitzung einen Insert in die Tabelle eingefügt hat. –

+0

yep, ein Tippfehler. merci –

3

Um den aktuellen Wert einer Sequenz zu erhalten, ohne sie zu beeinflussen oder eine vorherige Einfügung in derselben Sitzung zu benötigen, können Sie;

SELECT last_value FROM tablename_fieldname_seq; 

An SQLfiddle to test with.

Natürlich wird der aktuelle Wert immer nicht garantieren, dass der nächste Wert, den Sie tatsächlich last_value + 1 bekommen ist, wenn es andere gleichzeitige Sitzungen Einsätze tun, da eine andere Sitzung, bevor Sie den Serienwert genommen haben.

+2

Beachten Sie, dass es nicht empfohlen wird, sich auf die Benennung von Sequenzen zu verlassen, die für 'SERIAL'-Spalten generiert wurden, da dies als Implementierungsdetail betrachtet und geändert werden kann.Die Funktion ['pg_get_serial_sequence()'] (http://www.postgresql.org/docs/current/static/functions-info.html) gibt Ihnen den Namen der Sequenz, die einer bestimmten Spalte "gehört". – IMSoP

Verwandte Themen