Start · Sprachen · PHP · Referenz · db2_last_insert_id

db2_last_insert_id

Funktion

Liefert die automatisch erzeugte ID (Auto-Increment- oder Identity-Spalte) der letzten erfolgreichen INSERT-Anweisung für eine gegebene Datenbankverbindung.

seit PHP 5.1.0 Kategorie: db

Signatur

db2_last_insert_id(resource $resource): string|null

Beschreibung

db2_last_insert_id() gibt den Wert zurück, der bei der zuletzt ausgeführten INSERT-Anweisung automatisch für eine Identity- oder Auto-Increment-Spalte erzeugt wurde. Die Funktion ist Teil der IBM DB2-Erweiterung (ibm_db2) und verhält sich ähnlich wie mysqli_insert_id() oder PDO::lastInsertId(), bezieht sich aber ausschließlich auf DB2- und Informix-Datenbanken.

Der Rückgabewert ist an die Verbindungsressource gebunden, nicht an ein Statement-Handle. Es wird stets die letzte ID der aktuellen Verbindungssitzung zurückgegeben, unabhängig davon, welches Statement-Handle zuletzt genutzt wurde. Bei Verwendung von Prepared Statements oder bei Batch-Inserts sollte die ID unmittelbar nach dem relevanten INSERT abgerufen werden, um korrekte Ergebnisse zu erhalten.

Die Funktion ist besonders nützlich, wenn nach einem INSERT der erzeugte Primärschlüssel für weitere Operationen (z. B. das Einfügen verknüpfter Datensätze in einer anderen Tabelle) benötigt wird. Da nur die ID der letzten INSERT-Operation zurückgegeben wird, ist ein sofortiger Aufruf nach dem INSERT entscheidend, bevor weitere Datenbankoperationen stattfinden.

Gibt null zurück, wenn die letzte INSERT-Anweisung keine automatisch generierte ID erzeugt hat (z. B. weil die Tabelle keine Identity-Spalte besitzt) oder wenn seit dem Aufbau der Verbindung noch kein INSERT durchgeführt wurde.

Parameter

Name Typ Default Beschreibung
$resource Pflicht resource Eine aktive DB2-Datenbankverbindungsressource, wie sie von db2_connect() oder db2_pconnect() zurückgegeben wird.

Rückgabewert

Typ
string|null
Beschreibung
Gibt die automatisch erzeugte ID der letzten erfolgreichen INSERT-Anweisung als string zurück. Gibt null zurück, wenn kein automatisch generierter Wert verfügbar ist (keine Identity-Spalte vorhanden oder noch kein INSERT seit dem Verbindungsaufbau ausgeführt).

Beispiele

Einfaches Einfügen und Abruf der zuletzt generierten ID

<?php
$conn = db2_connect('SAMPLE', 'db2user', 'geheimesPasswort');

if ($conn) {
    $sql = "INSERT INTO kunden (name, email) VALUES ('Max Mustermann', 'max@example.com')";
    $result = db2_exec($conn, $sql);

    if ($result) {
        $lastId = db2_last_insert_id($conn);
        echo "Neuer Datensatz eingefügt mit ID: " . $lastId;
    } else {
        echo "Fehler beim Einfügen: " . db2_stmt_errormsg();
    }

    db2_close($conn);
} else {
    echo "Verbindungsfehler: " . db2_conn_errormsg();
}
?>
Neuer Datensatz eingefügt mit ID: 42

Prepared Statement und Abruf der ID für Folge-Insert

<?php
$conn = db2_connect('SAMPLE', 'db2user', 'geheimesPasswort');

if ($conn) {
    // Hauptdatensatz einfügen
    $stmtKunde = db2_prepare($conn, "INSERT INTO kunden (name, email) VALUES (?, ?)");
    db2_execute($stmtKunde, ['Erika Musterfrau', 'erika@example.com']);

    // Sofort nach dem INSERT die generierte ID abrufen
    $kundenId = db2_last_insert_id($conn);
    echo "Kunde angelegt mit ID: " . $kundenId . PHP_EOL;

    // Verknüpften Datensatz mit der neuen Kunden-ID einfügen
    $stmtAdresse = db2_prepare(
        $conn,
        "INSERT INTO adressen (kunden_id, strasse, ort) VALUES (?, ?, ?)"
    );
    db2_execute($stmtAdresse, [$kundenId, 'Musterstraße 1', 'Berlin']);

    $adressId = db2_last_insert_id($conn);
    echo "Adresse angelegt mit ID: " . $adressId . PHP_EOL;

    db2_close($conn);
}
?>
Kunde angelegt mit ID: 101 Adresse angelegt mit ID: 55

// Wichtig · Fallstricke

Verbindungsspezifisch: Die zurückgegebene ID bezieht sich immer auf die letzte INSERT-Operation der übergebenen Verbindungsressource. Bei der Verwendung von persistenten Verbindungen (db2_pconnect()) kann es zu unerwarteten Ergebnissen kommen, wenn eine Verbindung aus dem Pool eine vorherige Sitzung weiterverwendet.

Kein Ersatz für sequenzbasierte IDs: Die Funktion funktioniert ausschließlich mit Identity-Spalten (automatisch inkrementierte Spalten). Werte, die über DB2-Sequenzen (NEXT VALUE FOR sequence) erzeugt werden, sind mit db2_last_insert_id() nicht abrufbar.

Rückgabe als String: Da DB2 Identity-Werte sehr groß werden können (BIGINT), wird der Wert als string zurückgegeben, um Überläufe bei 32-Bit-PHP-Integer zu vermeiden. Für arithmetische Operationen kann eine explizite Typenumwandlung mit (int) oder bcmath-Funktionen sinnvoll sein.