PDOで最後に登録したデータのlastInsertIDを取得する

レコードを登録後、登録したレコードに割り振られたID(主キー)を取得したいことがあります。PDOで登録したデータのIDを取得する方法を、MySQL、PostgreSQL、SQLiteの3種類のデータベースを使って紹介します。

INSERT文の基本とlastInsertIDの取得


$date = '20191014';
// SQLを作成
$sql = "INSERT INTO users (
	name, age
) VALUES (
	'田中', $date
)";

// SQL実行(データ登録)
$res = $dbh->query($sql);

// 登録したデータのIDを取得して出力
var_dump($dbh->lastInsertId());

最初に登録したデータのIDを取得する方法から解説します。
PDOには元々lastInsertIdメソッドが用意されており、データ登録後にこのメソッドを呼び出すことでIDを取得することができます。

ここからは、MySQL、PostgreSQL、SQLiteのデータベースを使用してlastinsertidの取得の方法を紹介します。

MYSQLでのPDOを用いたLastinsertidの取得の仕方

<?php

// 変数の初期化 & 日時の取得
$sql = null;
$res = null;
$dbh = null;


try {
	// DBへ接続
	$dbh = new PDO("mysql:host=127.0.0.1; dbname=test; charset=utf8", 'username', 'password');

	// SQL作成
	$sql = "INSERT INTO user_list (
		name, age
	) VALUES (
		'田中', 35
	)";

	// SQL実行
	$res = $dbh->query($sql);

	// 登録したデータのIDを取得して出力
	var_dump($dbh->lastInsertId());

} catch(PDOException $e) {
	echo $e->getMessage();
	die();
}

// 接続を閉じる
$dbh = null;

PostgreSQLでのPDOを用いたLastinsertidの取得の仕方

<?php

// 変数の初期化 & 日時の取得
$sql = null;
$res = null;
$dbh = null;
$date = date('Y-m-d H:i:s');

try {
	// DBへ接続
	$dbh = new PDO("pgsql:host=127.0.0.1; dbname=test;", 'username', 'password');

	// SQL作成
	$sql = "INSERT INTO user_list (
		name, age, 

	) VALUES (
		'テスト奈津子', 25
	)";

	// SQL実行
	$res = $dbh->query($sql);

	// 登録したデータのIDを取得して出力
	var_dump($dbh->lastInsertId());

} catch(PDOException $e) {
	echo $e->getMessage();
	die();
}

// 接続を閉じる
$dbh = null;

PostgreSQにはMySQLの「AUTO_INCREMENT」属性はありませんが、代わりにSerialを指定することで自動連番のIDを設定することができます。
そのため、PostgreSQLでlastInsertIdメソッドを使うには、型が「Serial」の主キー(PRIMARY KEY)がカラムに存在している必要があります。

SQLiteでのPDOを用いたLastinsertidの取得の仕方

最後にSQLiteでlastinsertidを取得します。

<?php

// 変数の初期化 & 日時の取得
$sql = null;
$res = null;
$dbh = null;

try {
	// DBへ接続
	$dbh = new PDO("sqlite:./sqlite/test.sqlite3");

	// SQL作成
	$sql = "INSERT INTO user_list (
		name, age
	) VALUES (
		'田中', 25
	)";

	// SQL実行
	$res = $dbh->query($sql);

	// 登録したデータのIDを取得して出力
	var_dump($dbh->lastInsertId());

} catch(PDOException $e) {

	echo $e->getMessage();
	die();
}

// 接続を閉じる
$dbh = null;

SQLiteでlastInsertIdメソッドを使用するには、整数型の主キーである「INTEGER PRIMARY KEY」を指定したカラムが必要になります。
カラム名には制限がありませんので、「id」などでなくても大丈夫です。

フレームワークを使用する場合

近年の開発ではフレームワークを使用してlastinsertidを取得するのが一般的だと思います。

様々なフレームワークを使用した際のlastinsertidの取得の方法についてのリンクを貼るので参考にしてください。

Laravel5でインサートしたLastInsertIDを取得する方法について紹介しています。
CakePHPでインサートしたLast Insert IDを取得する方法について紹介しています。
CodeIgniterで最後にインサートしたLastInsertIDを取得する方法について紹介しています。
Symfony3でインサートしたLast Insert IDを取得する方法を紹介しています。