最終更新日:
公開日:
レシピ
データベース 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を取得する方法でした。