PHPプログラミング

最終更新日:
公開日:

レシピ

データベース PDO

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

PDOでデータを登録した後、データに割り振られたIDを取得する方法についてMySQL、MariaDB、PostgreSQL、SQLiteの4種類のデータベースを使って解説します。

この記事のポイント

  • データベースに最後に登録したデータのIDを取得する
  • データベース別に取得方法と返り値を確認する
  • IDを取得するためのテーブル構造を確認する

目次

PDOを使ってデータを登録する

今回は新しく登録したデータに割り振られた位置となるIDを取得する方法をMySQL&MariaDB、PostgreSQL、SQLiteの順に解説していきます。

PDOを使ったデータの登録方法については「PDOでデータを新規登録:INSERT」をご覧ください。

登録したデータのIDを取得するlastInsertIdメソッド

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

lastInsertIdメソッドの使用例

// SQLを作成
$sql = "INSERT INTO user_list (
	name, age, registry_datetime
) VALUES (
	'テスト健太', 24, '$date'
)";

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

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

それぞれのデータベースごとにlastInsertIdメソッドを実行してみましょう。

MySQLとMariaDBで登録したデータのIDを取得する

まずはMySQLとMariaDBから、登録したデータのIDを取得していきます。
この2つのデータベースは方法が共通であるため、まとめてみていきます。
また、データを登録する流れについては「PDOでデータを新規登録:INSERT」と同じ形です。

コード例

<?php

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

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, registry_datetime
	) VALUES (
		'テスト健太', 24, '$date'
	)";

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

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

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

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

登録に成功した時の出力結果

string(1) "5"

登録に失敗した時の出力結果

string(1) "0"

出力された結果を見ると、しっかりと登録されたデータのIDである「5」が取得できていることが確認できました。
もしデータの登録に失敗したときなどでIDを取得できなかった場合は「0」を取得します。

このメソッドを使用するには条件があり、lastInsertIdメソッドを使用するにはテーブルのカラムに型が「Integer」、属性が「AUTO_INCREMENT」に設定された主キー(PRIMARY KEY)をテーブルのカラムに持つ にはカラム名は特に制限がなく、「id」や「ID」である必要はありません。
ただし、型は「Integer」、そして属性は「AUTO_INCREMENT」であり、かつ主キー(PRIMARY KEY)であることが条件となります。

もし型や属性が条件を満たしていない場合は、データの登録は成功してもlastInsertIdメソッドで取得できる値は常に「0」です。
また、取得した値の型はIntegerではなくStringであることに注意してください。

PostgreSQLで登録したデータのIDを取得する

続いて、PostgreSQLで登録したデータのIDを取得します。
全体の流れは上記MySQLと同じです。

コード例

<?php

// 変数の初期化 & 日時の取得
date_default_timezone_set('Asia/Tokyo');
$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, registry_datetime
	) VALUES (
		'テスト奈津子', 25, '$date'
	)";

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

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

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

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

登録に成功した時の出力結果

string(1) "5"

登録に失敗した時の出力結果

bool(false)

データ登録に成功し、登録IDを取得できた場合の値はMySQLと同じです。
型もStringでした。

しかし、登録IDを取得できなかった場合はPostgreSQLだと論理値の「false」を取得できます。
この点だけはMySQLと異なります。

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

SQLiteで登録したデータのIDを取得する

最後にSQLiteで登録したデータのIDを取得します。
全体の流れは上記2つのデータベースと同様です。

コード例

<?php

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

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

	// SQL作成
	$sql = "INSERT INTO user_list (
		name, age, registry_datetime
	) VALUES (
		'テスト有希', 25, '$date'
	)";

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

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

} catch(PDOException $e) {

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

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

登録に成功した時の出力結果

string(1) "4"

登録に失敗した時の出力結果

string(1) "0"

取得できる結果はMySQLと同じでした。
型もやはりStringです。

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

以上、SQLiteで登録したデータのIDを取得する方法でした。