PDO::lastInsertId
Возвращает идентификатор для строки, которая самой последней вставлена в таблицу базы данных. Таблица должна содержать столбец IDENTITY NOT NULL. Если указано имя последовательности, lastInsertId
возвращает последний вставленный порядковый номер для указанного имени последовательности (дополнительные сведения о порядковых номерах см. здесь).
Синтаксис
string PDO::lastInsertId ([ $name = NULL ] );
Параметры
$name: необязательная строка, позволяющая указать имя последовательности.
Возвращаемое значение
Если имя последовательности не предоставляется, строка идентификатора для последней добавленной записи. Если имя последовательности предоставляется, строка идентификатора для последней добавленной последовательности. Если вызов метода завершается ошибкой, возвращается пустая строка.
Замечания
Добавлена поддержка PDO версии 2.0 драйверов Майкрософт для PHP для SQL Server.
Между версиями 2.0 и 4.3 необязательным параметром является имя таблицы, а возвращаемым значением — идентификатор последней добавленной в указанную таблицу записи.
Начиная с 5.0, как необязательный параметр рассматривается имя последовательности, а как возвращаемое значение — последовательность, которую добавили для указанного имени последовательности последней.
Если имя таблицы указано для версий после 4.3, lastInsertId
возвращает пустую строку.
Последовательности поддерживаются только в SQL Server 2012 и более поздних версиях.
Пример
<?php
$server = "myserver";
$databaseName = "mydatabase";
$uid = "myusername";
$pwd = "<password>";
try {
$conn = new PDO("sqlsrv:Server=$server;Database=$databaseName", $uid, $pwd);
// One sequence, two tables
$tableName1 = 'seqtable1';
$tableName2 = 'seqtable2';
$sequenceName = 'sequence1';
$stmt = $conn->query("IF OBJECT_ID('$sequenceName', 'SO') IS NOT NULL DROP SEQUENCE $sequenceName");
$sql = "CREATE TABLE $tableName1 (seqnum INTEGER NOT NULL PRIMARY KEY, SomeNumber INT)";
$stmt = $conn->query($sql);
$sql = "CREATE TABLE $tableName2 (ID INT IDENTITY(1,2), SomeValue char(10))";
$stmt = $conn->query($sql);
$sql = "CREATE SEQUENCE $sequenceName AS INTEGER START WITH 1 INCREMENT BY 1 MINVALUE 1 MAXVALUE 100 CYCLE";
$stmt = $conn->query($sql);
$ret = $conn->exec("INSERT INTO $tableName1 VALUES( NEXT VALUE FOR $sequenceName, 20)");
$ret = $conn->exec("INSERT INTO $tableName1 VALUES( NEXT VALUE FOR $sequenceName, 40)");
$ret = $conn->exec("INSERT INTO $tableName1 VALUES( NEXT VALUE FOR $sequenceName, 60)");
$ret = $conn->exec("INSERT INTO $tableName2 VALUES( '20' )");
// return the last sequence number if sequence name is provided
$lastSeq1 = $conn->lastInsertId($sequenceName);
// defaults to $tableName2 -- because it returns the last inserted id value
$lastRow = $conn->lastInsertId();
// providing a table name in lastInsertId should return an empty string
$lastSeq2 = $conn->lastInsertId($tableName2);
echo "Last sequence number = $lastSeq1\n";
echo "Last inserted ID = $lastRow\n";
echo "Last inserted ID when a table name is supplied = $lastSeq2\n";
// One table, two sequences
$tableName = 'seqtable';
$sequence1 = 'sequence1';
$sequence2 = 'sequenceNeg1';
$stmt = $conn->query("IF OBJECT_ID('$sequence1', 'SO') IS NOT NULL DROP SEQUENCE $sequence1");
$stmt = $conn->query("IF OBJECT_ID('$sequence2', 'SO') IS NOT NULL DROP SEQUENCE $sequence2");
$sql = "CREATE TABLE $tableName (ID INT IDENTITY(1,1), SeqNumInc INTEGER NOT NULL PRIMARY KEY, SomeNumber INT)";
$stmt = $conn->query($sql);
$sql = "CREATE SEQUENCE $sequence1 AS INTEGER START WITH 1 INCREMENT BY 1 MINVALUE 1 MAXVALUE 100";
$stmt = $conn->query($sql);
$sql = "CREATE SEQUENCE $sequence2 AS INTEGER START WITH 200 INCREMENT BY -1 MINVALUE 101 MAXVALUE 200";
$stmt = $conn->query($sql);
$ret = $conn->exec("INSERT INTO $tableName VALUES( NEXT VALUE FOR $sequence1, 20 )");
$ret = $conn->exec("INSERT INTO $tableName VALUES( NEXT VALUE FOR $sequence2, 180 )");
$ret = $conn->exec("INSERT INTO $tableName VALUES( NEXT VALUE FOR $sequence1, 40 )");
$ret = $conn->exec("INSERT INTO $tableName VALUES( NEXT VALUE FOR $sequence2, 160 )");
$ret = $conn->exec("INSERT INTO $tableName VALUES( NEXT VALUE FOR $sequence1, 60 )");
$ret = $conn->exec("INSERT INTO $tableName VALUES( NEXT VALUE FOR $sequence2, 140 )");
// return the last sequence number of 'sequence1'
$lastSeq1 = $conn->lastInsertId($sequence1);
// return the last sequence number of 'sequenceNeg1'
$lastSeq2 = $conn->lastInsertId($sequence2);
// providing a table name in lastInsertId should return an empty string
$lastSeq3 = $conn->lastInsertId($tableName);
echo "Last sequence number of sequence1 = $lastSeq1\n";
echo "Last sequence number of sequenceNeg1 = $lastSeq2\n";
echo "Last sequence number when a table name is supplied = $lastSeq3\n";
$stmt = $conn->query("DROP TABLE $tableName1");
$stmt = $conn->query("DROP TABLE $tableName2");
$stmt = $conn->query("DROP SEQUENCE $sequenceName");
$stmt = $conn->query("DROP TABLE $tableName");
$stmt = $conn->query("DROP SEQUENCE $sequence1");
$stmt = $conn->query("DROP SEQUENCE $sequence2");
unset($stmt);
unset($conn);
} catch (Exception $e) {
echo "Exception $e\n";
}
?>
Ожидаемые выходные данные:
Last sequence number = 3
Last inserted ID = 1
Last inserted ID when a table name is supplied =
Last sequence number of sequence1 = 3
Last sequence number of sequenceNeg1 = 198
Last sequence number when a table name is supplied =