[pgsql-jp: 37369] Re: 挿入したデータのserial値を取得する方法

ISHIDA Akio iakio @ mono-space.net
2006年 7月 28日 (金) 22:05:17 JST


こんにちは。石田@苫小牧市です。

create table test1 (id serial, name text);
insert into test1 (name) values('test name');
で test1 に insert した時の id の値を test2 に入れたいということ
ですよね?

insert into test2 (id, name) values(currval('test1_id_seq'), 'test name');

ではダメですか?

06/07/28 に 鈴木孝征<takamasa @ thaliana.myhome.cx> さんは書きました:
> 鈴木です。お返事どうもありがとうございます。
>
> Tietew wrote:
> > select currval('test1_id_seq');
>
> この方法だとデータの追加からselectまでの間、テーブルをロックしないといけ
> ませんよね。私の作っているものではデータの追加がほぼ同時に起こることはな
> いので問題ありませんが、一応そういうことも考えないといけないかと思うのです。

これは他の方もおっしゃっていますが、ロックの必要はありません。
currval は現在の接続で最後に nextval された時の値を返します。

>
> あと、test1_id_seqというシーケンス名はcreate tableのときにPostgreSQLが自
> 動で作成しますが、命名方法が変わったりしないのでしょうか。先に自分でシー
> ケンスを作成していれば、名前をコントロールできるのですが、create tableの
> 結果を解釈して名前を取得する処理が面倒そうです。


pg_get_serial_sequence(table_name, column_name)
という関数があるのですが、残念ながら 8.0 以降です。

>
> Akinori FUJII wrote:
> > defaultにnextvalを設定しているのなら
> >
> > 下記のINSERT文で自動採番されたあとにレコードが登録されるはずですよ。
> > insert into test2 (name) values('test name');
>
> その自動採番された数字がinsert文の返り値かなにかでわかればいいのですが、
> 方法はselect currval()しかないのですよね。
>
>
>


-- 
ISHIDA Akio <iakio @ mono-space.net/ishida @ cycleof5th.com>



pgsql-jp メーリングリストの案内