[PHP-users 2999] Re: PEAR+Postgresで Ins ert 時のシリアルを知りたい
Yasuo Ohgaki
php-users@php.gr.jp
Sat, 20 Oct 2001 16:03:44 +0900
Katagiri Michiko wrote:
> さっそくのお返事、ありがとうございますm(_ _)m
>
>> ロジックは違いますが、insert後のserial型の値を取得したい場合、私は
>> 先にnextval()を実行して取得した番号をinsertしています。この手順の
>> 方が簡単と思います。
>> pg_getlastoid()を使わなくて済むので、PEARでも同じ様に実装できると
>> 思います。(nextval()を実行する部分だけ抽象化する関数を自身で書く必
>> 要があるとはおもいますが、、、)
>
>
> すみません、先にnextvalを実行するというのは、具体的にどうするの
> でしょうか?
> nextvalをselectで表示しただけでは、表示から実際のInsertまでの
> 間に、他のプロセスでInsertされてしまったときに、値がバッティング
> してしまう可能性がでるような気がしてしまうのですが、気のせいで
> しょうか?
nextval()で取得した値が同じになることは仕組み上ありません。(例外は
最大値まで使い切った時) 詳しいことはPostgreSQLのマニュアルに書いて
あったと思います。
単純に
SELECT nextval('some_sequence') AS next_id;
としてsequenceから一意的な番号を取得し、結果を取り出します。
$query = "SELECT nextval('$seq_name') AS next_id";
$query_id = pg_Exec($this->link_id, $query);
$res = pg_Fetch_Array($query_id, 0, PGSQL_ASSOC);
を実行して取得した値をinsertに利用すればOkです。
>> 思います。(nextval()を実行する部分だけ抽象化する関数を自身で書く必
>> 要があるとはおもいますが、、、)
PEARは使い込んでいないので良く知りませんが、確かDBに依存するNextID
()等をメソッドは実装されていないと記憶しています。他のDBに変更する
際に、コードの変更が多くならないよう、次のIDを取得する関数を別に用
意しておけば、他のDBに変更する際に、ソース中に散らばったSQL文を直
さすにすみます。
--
Yasuo Ohgaki
yohgaki@dd.iij4u.or.jp
__________________________________________________
Do You Yahoo!?
Yahoo! BB is Broadband by Yahoo! http://bb.yahoo.co.jp/