PDO::lastInsertId
データベースのテーブルに最後に挿入された行の識別子を返します。 このテーブルには、IDENTITY NOT NULL 列が必要です。 シーケンス名が指定されている場合、lastInsertId
は、指定されたシーケンス名に対して最後に挿入されたシーケンス番号を返します (シーケンス番号の詳細については、こちらを参照してください)。
構文
string PDO::lastInsertId ([ $name = NULL ] );
パラメーター
$name: シーケンス名を指定できる省略可能な文字列。
戻り値
シーケンス名が指定されていない場合、最後に追加された行の識別子の文字列。 シーケンス名が指定されている場合は、最後に追加されたシーケンスの識別子の文字列。 メソッドの呼び出しが失敗した場合、空の文字列が返されます。
解説
PDO のサポートは Microsoft SQL Server 用 Drivers for PHPのバージョン 2.0 で追加されました。
バージョン 2.0 からバージョン 4.3 までは、省略可能なパラメーターはテーブル名で、戻り値は、指定されたテーブルに最後に追加された行の ID になります。
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 =