PHPプログラミング

ベストプラクティス

データベース PDO その9

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

  • このエントリーをはてなブックマークに追加

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

目次

  1. #  PDOを使ってデータを登録する
  2. #  登録したデータのIDを取得するlastInsertIdメソッド
  3. #  MySQLで登録したデータのIDを取得する
  4. #  PostgreSQLで登録したデータのIDを取得する
  5. #  SQLiteで登録したデータのIDを取得する

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

今回は新しく登録したデータに割り振られた位置となるIDを取得する方法を解説していきます。
次のような方が対象です。

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

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で登録したデータのIDを取得する

まずはMySQLから、登録したデータのIDを取得していきます。
データを登録する流れについては、「PDOでデータを新規登録:INSERT」と同じ形です。

index.php

<?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;

データ登録後のテーブル

データ登録後のテーブル(MySQL)

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

string(1) "5"

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

string(1) "0"

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

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

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

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

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

index.php

<?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;

データ登録後のテーブル

データ登録後のテーブル(PostgreSQL)

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

string(1) "5"

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

bool(false)

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

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

PostgreSQLでを使用するには、カラムに型が「Serial」である主キー(PRIMARY KEY)が存在する必要があります。

PostgreSQにはMySQLの「AUTO_INCREMENT」属性はありませんが、代わりにSerialを指定することで自動連番のIDを設定することができます。

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

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

index.php

<?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;

データ登録後のテーブル

データ登録後のテーブル(SQLite)

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

string(1) "4"

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

string(1) "0"

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

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

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

  • このエントリーをはてなブックマークに追加