[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/