PHP

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

  1. 最終更新日:
  2. 公開日:

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)をテーブルのカラムに持つ必要があります。
もし型や属性が条件を満たしていない場合は、データの登録は成功してもlastInsertIdメソッドで取得できる値は常に「0」です。
また、取得した値の型はIntegerではなくStringであることに注意してください。

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

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

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;

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

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 コード例

<?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を取得する方法でした。

記事一覧