2010年12月 5日

[pgsql-jp: 40589] Re:グループ毎に自動採番したいのですが

?yum様、
Itagaki Takahiro様、ありがとうございます。

お聞きしたいのですが

> [その3 : トリガでmax()]
> CREATE FUNCTION assign_s_id() RETURNS TRIGGER AS $$
> BEGIN

> PERFORM 1 FROM users WHERE u_id = 1 AND s_id = 1 FOR UPDATE;
> -- IF NOT FOUND
> -- FIXME: u_idごとの最初の行の時には別のロックが要る?
> -- END IF;
> SELECT coalesce(max(s_id), 0) + 1 INTO NEW.s_id FROM users WHERE
> u_id = NEW.u_id;
> RETURN NEW;
> END;
> $$ LANGUAGE plpgsql;

> CREATE TRIGGER users_insert BEFORE INSERT ON users FOR EACH ROW
> EXECUTE PROCEDURE assign_s_id();

で、
-- IF NOT FOUND
-- FIXME: u_idごとの最初の行の時には別のロックが要る?
-- END IF;
は、どうしてこの処理"別のロック"が必要になるのでしょうか?

また、最後の
> INSERT INTO users (u_id, s_id) VALUES (<値>, DEFAULT);
というののINSERT文ですが
DEFAULTにmax(s_id)+1の値が入るという動作でいいのでしょうか?


投稿者 xml-rpc : 2010年12月 5日 16:36
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/100583
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。