Frage

Gibt es eine Alternative für? mysql_insert_id() PHP-Funktion für PostgreSQL?Die meisten Frameworks lösen das Problem teilweise dadurch, dass sie den aktuellen Wert der in der ID verwendeten Sequenz ermitteln.Es kann jedoch vorkommen, dass der Primärschlüssel keine serielle Spalte ist....

War es hilfreich?

Lösung

Von der PostgreSQL Sicht in Pseudo-Code:

 * $insert_id = INSERT...RETURNING foo_id;-- only works for PostgreSQL >= 8.2. 

 * INSERT...; $insert_id = SELECT lastval(); -- works for PostgreSQL >= 8.1

 * $insert_id = SELECT nextval('foo_seq'); INSERT INTO table (foo...) values ($insert_id...) for older PostgreSQL (and newer PostgreSQL)

pg_last_oid() nur funktioniert, wo Sie OIDs haben. OIDs sind standardmäßig seit PostgreSQL 8.1 abgeschaltet ist.

So

, je nachdem, welche PostgreSQL-Version haben, sollten Sie eine der oben genannten Methode auswählen. Idealerweise natürlich eine Datenbank-Abstraktionsbibliothek verwenden, die die oben abstrahiert. Andernfalls wird im niedrigen Level-Code, es sieht aus wie:

Methode eins: INSERT ... RÜCKKEHR

// yes, we're not using pg_insert()
$result = pg_query($db, "INSERT INTO foo (bar) VALUES (123) RETURNING foo_id");
$insert_row = pg_fetch_row($result);
$insert_id = $insert_row[0];

Methode zwei: INSERT; lastval ()

$result = pg_execute($db, "INSERT INTO foo (bar) values (123);");
$insert_query = pg_query("SELECT lastval();");
$insert_row = pg_fetch_row($insert_query);
$insert_id = $insert_row[0];

Methode drei: nextval (); INSERT

$insert_query = pg_query($db, "SELECT nextval('foo_seq');");
$insert_row = pg_fetch_row($insert_query);
$insert_id = $insert_row[0];
$result = pg_execute($db, "INSERT INTO foo (foo_id, bar) VALUES ($insert_id, 123);");

Die sicherste Wette wäre die dritte Methode sein, aber es ist unhandlich. Die sauberste ist die erste, aber Sie müssen eine aktuelle PostgreSQL laufen. Die meisten db Abstraktion Bibliotheken noch nicht die erste Methode verwenden though.

Andere Tipps

Schauen Sie sich die RÜCKKEHR optionale Klausel für eine INSERT Aussage. (Link zur offiziellen PostgreSQL-Dokumentation)

Aber im Grunde, was Sie tun:

INSERT INTO table (col1, col2) VALUES (1, 2) RETURNING pkey_col

und die INSERT-Anweisung selbst liefert die ID (oder was auch immer Ausdruck, den Sie angeben) der betroffenen Zeile.

Von php.net:

$res=pg_query("SELECT nextval('foo_key_seq') as key");
$row=pg_fetch_array($res, 0);
$key=$row['key'];
// now we have the serial value in $key, let's do the insert
pg_query("INSERT INTO foo (key, foo) VALUES ($key, 'blah blah')");

Dies sollte immer eindeutige Schlüssel liefern, weil Schlüssel aus der Datenbank abgerufen werden nie wieder abgerufen werden.

Sie können auch verwendet werden:

$result = pg_query($db, "INSERT INTO foo (bar) VALUES (123) RETURNING foo_id");
$insert_row = pg_fetch_result($result, 0, 'foo_id');

Sie in pg_fetch_result angeben müssen Sie die Nummer der Zeile und den Namen des Feldes, das Sie suchen, ist dies eine genauere Möglichkeit, die Daten zu erhalten, die Sie benötigen, aber ich weiß nicht, ob dies etwas hat Strafe in der Leistung der Abfrage. Denken Sie daran, dass diese Methode ist für PostgreSQL-Versionen 8.2 und höher.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top