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

yukihito miso mail @ rishiri.info
2010年 12月 5日 (日) 16:36:55 JST


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の値が入るという動作でいいのでしょうか?



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