最後にインサートしたレコードのIDを取得する方法

オートインクリメントで振られたIDを知りたい時の話

普通の方法

大抵のRMDBはオートインクリメントで振られたIDを覚えているので、 再度クエリを発行すればID値を取り出すことができる。

  • 複数のユーザが同時にアクセスして登録したら?
    • 軽く試してみたが問題ない。
    • コネクションを張る度に別プロセスと認識される
    • 同一コネクション内でインサートしたオートインクリメント値が還ると思われる

MySQL

SELECT last_insert_id()

SQLite

SELECT last_insert_rowid()

PHPによるアダプターを利用する場合

PDO

PDO::lastInsertIdを使う。 上記のように、オートインクリメントによって振られたIDを取り出すSQL文はDB毎で異なる為、 PHPのソースコードとDB操作を分けるには不向きで、その差異を吸収する為に存在するメソッドと思われる。 要するにPDOを使う場合は何も考えずにPDO::lastInsertIdでおk

// DBへ接続し、INSERT文を発行
$db = new PDO($dsn);
$sql = 'INSERT INTO .....';
$db->exec($sql);

// オートインクリメント値を取り出す
$id = $db->lastInsertId();

Zend Framework

アダプタークラスにlastInsertIdというメソッドが用意されている。 アダプターにPDOを使用した場合、lastInsertIdを呼んでるらしい。

$table = new Zend_Db_Table();
// Insert文発行
$adapter = $table->getAdapter();
$id = $adapter->lastInsertId();

$id = $table->getAdapter()->lastInsertId(); // 一発でやってもOK

Zend_Db_Tableオブジェクトにアクセス出来ればlastInsertId()メソッド叩くだけで出てくる。 自社開発のコレクターとかモデルとか使ってる場合でも、 以下のようにZend_Db_Tableオブジェクトを返すメソッドを作成すれば良い。

$id = $db_model->getTable()->getAdapter()->lastInsertId();