[PHP-users 15197]Re: PEARDBでmysql_insert_id()と同じメソッドは?

yuji koga koga-y @ mcp-net.com
2003年 5月 12日 (月) 16:44:19 JST


お世話になります。古賀です。
Seto様、レス有り難う御座いました。
 
> MySQLでは Insertした最後のIDを簡単に入手できますが
> たとえばPostgreSQLでは 最後のIDを直接入手する方法がなく
> OIDを取得してから そのレコードのPrimaryKeyを
> 入手することになると思います。
> しかしそれでは、手間がかかるのと
> 汎用的にPrimaryKeyのフィールド名を決めようとすると
> 更なる手間となると思います。(固定しちゃえば簡単ですが)
>
> 何が言いたいのかと言うとDB::nextid() を使用したほうが
> PEARらしいのでは?という気がするのです。

なるほどです。仰っている意味は、おそらく

「せっかくデータベースの種類にかかわらず
 統一して使えるPEAR DBが用意されたのに、
 そこにmySQLにしかない機能を入れるのは、
 本末転倒である」

ということなのでしょう。自分も、おそらく同じ結論に達しようとしています。

自分も、先ほど

>>> SELECT LAST_INSERT_ID()
>>> のようなクエリを実行することで解決できるかもしれません。
>> この処理を、DB->LAST_INSERT_ID()みたいなメソッドとして
>> DBクラスを継承したユーザー定義クラスに埋め込もうと思います。

と発言してから、一度それを作ったあと、
「SELECT LAST_INSERT_ID() って、他のDBと互換あるのかな?」
と酷く心配になりました。

なにぶん勉強不足なので、他(mySQL以外)を知らず、
これから調べてみようかナ?と思い、手っ取り早い方法として、
PEAR DBのソースを調べていた所でした。

すると、pear/DB/mysql.phpでは、DB::nextid()の定義の中で

 $result = $this->query("UPDATE ${seqname} ".
                                   'SET id=LAST_INSERT_ID(id+1)');

となっているか所が、pear/DB/pgsql.phpでは同じか所で

 $result = $this->query("SELECT NEXTVAL('${seqname}')");

となっているではありませんか!
これを見て、LAST_INSERT_ID()が
mySQLローカルであることを予感しました。。。。

少し、考えを整理し直したいと思います。



<? /*
株式会社メディアプレス   制作課  古賀裕二
       会社:koga-y @ mcp-net.com
       自宅:yuuukunn @ h7.dion.ne.jp
*/ ?>



PHP-users メーリングリストの案内