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

渋谷泰宏 yasuhiro_shibutani @ ybb.ne.jp
2006年 7月 28日 (金) 19:46:01 JST


渋谷です。

> この方法だとデータの追加からselectまでの間、テーブルをロックしないといけ
> ませんよね。私の作っているものではデータの追加がほぼ同時に起こることはな
> いので問題ありませんが、一応そういうことも考えないといけないかと思うのです。

テーブル(test2?)をロックするとシーケンスもロックされるのでしたっけ?
シーケンスの使用=そのテーブルに対する編集操作という前提だから
同じ意味に捉えれば良いということかな?

私なら、データ追加用の plpgsql 関数を作成し、変数に nextval の結果を
取得しておき、それを INSERT と次の処理の両方に使います。
トランザクション処理をプログラム側で記述するのって嫌いですし・・・

簡単とは言えないので質問の答えにはなってないですね。。

06/07/28 に 鈴木孝征<takamasa @ thaliana.myhome.cx> さんは書きました:
> 鈴木です。お返事どうもありがとうございます。
>
> Tietew wrote:
> > select currval('test1_id_seq');
>
> この方法だとデータの追加からselectまでの間、テーブルをロックしないといけ
> ませんよね。私の作っているものではデータの追加がほぼ同時に起こることはな
> いので問題ありませんが、一応そういうことも考えないといけないかと思うのです。
>
> あと、test1_id_seqというシーケンス名はcreate tableのときにPostgreSQLが自
> 動で作成しますが、命名方法が変わったりしないのでしょうか。先に自分でシー
> ケンスを作成していれば、名前をコントロールできるのですが、create tableの
> 結果を解釈して名前を取得する処理が面倒そうです。
>
> Akinori FUJII wrote:
> > defaultにnextvalを設定しているのなら
> >
> > 下記のINSERT文で自動採番されたあとにレコードが登録されるはずですよ。
> > insert into test2 (name) values('test name');
>
> その自動採番された数字がinsert文の返り値かなにかでわかればいいのですが、
> 方法はselect currval()しかないのですよね。
>
>
>


-- 
渋谷 泰宏



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