last_insert_id (php)

Ok, auf zu Frage drei :)

In meinem alten System (mysql) habe ich nach dem Speichern von Objekten
mit mysql_insert_id() die zuletzt vergebene ID des auto_increment
ausgelesen und so die ID des Objektes ermittelt.

Das Postgres ein anderes Konzept hat (Sequenzen) und ich keine Funktion
gesehen habe, die soetwas macht, werde ich mir wohl mit einem Umweg
behelfen müssen.

Transktionen starten
Nächste ID aus Sequenz holen
Objekt explizit mit ermittelter ID Speichern
Tranaktion commiten
ID zurückliefern

Ich frage nur sicherheitshalber, nicht dass es da doch noch was gibt.
Oder habe ich vielleicht eine Möglichkeit mit dem Return-Value von
pg_query("INSERT INTO.....") etwas anzufangen?

---------------------------(end of broadcast)---------------------------
TIP 5: don't forget to increase your free space map settings
Marco Behnke [ Mo, 24 Juli 2006 17:31 ] [ ID #1402774 ]

Re: last_insert_id (php)

Marco Behnke wrote:
> Ok, auf zu Frage drei :)
>
> In meinem alten System (mysql) habe ich nach dem Speichern von Objekten
> mit mysql_insert_id() die zuletzt vergebene ID des auto_increment
> ausgelesen und so die ID des Objektes ermittelt.
>
> Das Postgres ein anderes Konzept hat (Sequenzen) und ich keine Funktion
> gesehen habe, die soetwas macht, werde ich mir wohl mit einem Umweg
> behelfen müssen.
>
> Transktionen starten
> Nächste ID aus Sequenz holen
> Objekt explizit mit ermittelter ID Speichern
> Tranaktion commiten
> ID zurückliefern

das mit der Transaktion an sich ist überflüssig da Sequences per-sess=
ion
operieren (und das macht sie auch usable - ansonsten gebs da jede Menge
race-conditions und concurrency Issues).
Zudem genügt ein Aufruf von select currval('sequence'); um den zuletzt
in der Session vergebene id zu ermitteln (zB die dein INSERT zuvor
implizit erzeugt hat).

>
> Ich frage nur sicherheitshalber, nicht dass es da doch noch was gibt.
> Oder habe ich vielleicht eine Möglichkeit mit dem Return-Value von
> pg_query("INSERT INTO.....") etwas anzufangen?

das was du möchtest nennt sich INSERT ... RETURNING und ist leider im
Moment nicht verfügbar - mit viel Glück vielleicht in 8.2 ...


Stefan

---------------------------(end of broadcast)---------------------------
TIP 3: Have you checked our extensive FAQ?

http://www.postgresql.org/docs/faq
Stefan Kaltenbrunner [ Mo, 24 Juli 2006 18:44 ] [ ID #1402775 ]

Re: last_insert_id (php)

am 24.07.2006, um 17:31:34 +0200 mailte Marco Behnke folgendes:
> Ok, auf zu Frage drei :)

Okay ;-)


> In meinem alten System (mysql) habe ich nach dem Speichern von Objekten
> mit mysql_insert_id() die zuletzt vergebene ID des auto_increment
> ausgelesen und so die ID des Objektes ermittelt.
>
> Das Postgres ein anderes Konzept hat (Sequenzen) und ich keine Funktion
> gesehen habe, die soetwas macht, werde ich mir wohl mit einem Umweg

Nein. nextval() und currval() sind Deine Freunde.
20:59 < akretschmer> ??currval
20:59 < rtfm_please> For information about currval
20:59 < rtfm_please> see http://www.postgresql.org/docs/current/static/fu=
nctions-sequence.html


Mach Deinen INSERT, und dann:

INSERT ... VALUES (..., currval(name_der sequence), ...);


Das ist innerhalb Deiner Session eindeutig, und auch für außerhalb
Deiner Session. Selbst ein ROLLBACK verändert _NICHT_ Deine Sequence.


Andreas
--
Andreas Kretschmer (Kontakt: siehe Header)
Heynitz: 035242/47215, D1: 0160/7141639
GnuPG-ID 0x3FFF606C http://wwwkeys.de.pgp.net
=3D=3D=3D Schollglas Unternehmensgruppe =3D=3D=3D

---------------------------(end of broadcast)---------------------------
TIP 3: Have you checked our extensive FAQ?

http://www.postgresql.org/docs/faq
andreas.kretschmer [ Mo, 24 Juli 2006 21:06 ] [ ID #1402776 ]
Datenbanken » gmane.comp.db.postgresql.german » last_insert_id (php)

Vorheriges Thema: Kann man Bytea-Daten via Monitor psql auslesen?
Nächstes Thema: Postgres Installation