Start · Sprachen · PHP · Referenz · pg_last_oid

pg_last_oid

Funktion

Gibt den Objektbezeichner (OID) des zuletzt über <code>pg_query()</code> oder <code>pg_execute()</code> eingefügten Datensatzes zurück.

seit PHP 4.2.0 Kategorie: db

Signatur

pg_last_oid(PgSql\Result $result): string|false

Beschreibung

pg_last_oid() liest den OID (Object Identifier) des zuletzt in eine PostgreSQL-Tabelle eingefügten Datensatzes aus dem übergebenen Ergebnis-Objekt aus. OIDs sind ganzzahlige, systemweit eindeutige Bezeichner, die PostgreSQL intern für Tabellenzeilen vergeben kann.

Die Funktion ist nützlich, wenn nach einem INSERT-Statement unmittelbar die ID des neu angelegten Datensatzes benötigt wird – etwa um anschließend weitere verknüpfte Datensätze einzufügen. Sie entspricht damit konzeptuell mysqli_insert_id() für MySQL.

Wichtiger Hinweis: OIDs werden nur dann zurückgegeben, wenn die Tabelle mit WITH OIDS erstellt wurde (PostgreSQL < 12) oder wenn OIDs für die Tabelle aktiviert sind. Seit PostgreSQL 12 werden OIDs standardmäßig nicht mehr unterstützt. Für moderne Anwendungen empfiehlt sich stattdessen die Verwendung von RETURNING id in der INSERT-Abfrage zusammen mit pg_fetch_result().

Gibt false zurück, wenn keine OID ermittelt werden konnte, z. B. weil das letzte Statement kein INSERT war, keine OIDs für die Tabelle aktiviert sind oder ein Fehler aufgetreten ist.

Parameter

Name Typ Default Beschreibung
$result Pflicht PgSql\Result Das PostgreSQL-Ergebnis-Objekt, das von pg_query(), pg_query_params() oder pg_execute() zurückgegeben wurde und einem INSERT-Statement entspricht.

Rückgabewert

Typ
string|false
Beschreibung
Gibt die OID des zuletzt eingefügten Datensatzes als Zeichenkette zurück (da OIDs die Grenzen von 32-Bit-Integers überschreiten können), oder false bei Fehler oder wenn keine OID verfügbar ist.

Beispiele

OID nach einem INSERT auslesen

<?php
$conn = pg_connect('host=localhost dbname=testdb user=postgres password=secret');

if (!$conn) {
    die('Verbindung fehlgeschlagen.');
}

// Tabelle muss WITH OIDS erstellt worden sein (PostgreSQL < 12)
$result = pg_query($conn, "INSERT INTO produkte (name, preis) VALUES ('Apfel', 0.49)");

if ($result === false) {
    die('INSERT fehlgeschlagen: ' . pg_last_error($conn));
}

$oid = pg_last_oid($result);

if ($oid !== false) {
    echo "Eingefügter Datensatz hat die OID: " . $oid . PHP_EOL;
} else {
    echo "Keine OID verfügbar (OIDs möglicherweise deaktiviert)." . PHP_EOL;
}

pg_close($conn);
Eingefügter Datensatz hat die OID: 24601

Moderne Alternative mit RETURNING

<?php
// Empfohlener Ansatz für PostgreSQL 12+ ohne OID-Unterstützung
$conn = pg_connect('host=localhost dbname=testdb user=postgres password=secret');

if (!$conn) {
    die('Verbindung fehlgeschlagen.');
}

// RETURNING gibt die tatsächliche Primärschlüssel-ID zurück
$result = pg_query_params(
    $conn,
    'INSERT INTO produkte (name, preis) VALUES ($1, $2) RETURNING id',
    ['Birne', 0.79]
);

if ($result === false) {
    die('INSERT fehlgeschlagen: ' . pg_last_error($conn));
}

$row = pg_fetch_assoc($result);
echo "Neu eingefügte ID: " . $row['id'] . PHP_EOL;

pg_close($conn);
Neu eingefügte ID: 42

// Wichtig · Fallstricke

Veraltet ab PostgreSQL 12: Ab PostgreSQL 12 unterstützen Tabellen standardmäßig keine OIDs mehr. pg_last_oid() gibt in solchen Umgebungen immer false zurück. Für neue Projekte sollte ausschließlich die RETURNING-Klausel in INSERT-Statements verwendet werden, um die ID des eingefügten Datensatzes abzurufen.

In PHP 8.1 wurde der Rückgabetyp des $result-Parameters von resource auf PgSql\Result geändert. Älterer Code, der resource erwartet, muss entsprechend angepasst werden.

Da OIDs auch systemweit für andere PostgreSQL-Objekte (Tabellen, Funktionen usw.) gelten, sind sie kein geeigneter Ersatz für anwendungsseitige Primärschlüssel.