[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 メーリングリストの案内