PEAR::DB での mysql_insert_id() の代替

直近にインサートしたレコードの auto_increment カラムの値を取得するために、mysql_insert_id() の代替となるメソッドを PEAR::DB で探してみたのですが、ありません。

PEAR::DB 的には DB::nextId() で値を取得してからインサートするようですが…うーん。ということで、以下のようなコードで代替しました。

function get_insert_id($db)
{
	$query  = "SELECT LAST_INSERT_ID() AS id";
	$stt = $db->prepare($query);
	$rs = $db->execute($stt);
	$row = $rs->fetchRow(DB_FETCHMODE_ASSOC);
	return $row["id"];
}

取得できる auto_increment カラムの値については、以下のようにクライアントごとに保持されます。

生成された ID は、接続ベースで サーバ内で保持されます。つまり、関数によって指定のクライアントに戻された値は、そのクライアントによって AUTO_INCREMENT カラムに影響を及ぼす最も最近のステートメントのために生成された、最初の AUTO_INCREMENT 値です。この値は、他のクライアントが独自の AUTO_INCREMENT 値を生成した場合でも、他のクライアントによって影響を受けることはありません。この動作は、各クライアントが他のクライアントの動向を気にせず、ロックやトランザクションなしで、独自の ID を呼び出せるようにします。

ただし、MySQL 5.1.11 以前と MySQL 5.1.12 以降では挙動が違うので注意。

スポンサーリンク
レクタングル(大)
レクタングル(大)