[pgsql-jp: 33457] Re: RULEにおけるNEW について

Jun Kitamura kitamura @ zoozee.jp
2004年 7月 1日 (木) 17:47:58 JST


北村です。

詳しくは
http://www.postgresql.jp/document/pg74doc/html/rules-update.html
を見てください。

> でも、なぜNEWというキーワードがnextval()を呼び出す必要が
> あるんでしょうね?
> 僕の理解では、NEWというキーワードは
> 「現在INSERT又はUPDATEしたレコードを格納している仮想テーブル」
> のようなものを意味していると思っていたのですが、
> (正確な定義をオンラインドキュメントから見つけられませんでした・・
>  違ってたらすいません。)
> だとしたら、なにもシーケンスとは関わりが無いはずなのに・・と
> 悩んでしまいました。

serial型を使う場合、デフォルト値が nextval('略_seq'::text) 
になるだけなんです。

パーサ → ルール(問い合わせツリー変更) → プランナ という流
れなので、少し乱暴な説明ですが、

INSERT INTO members (name) VALUES ('foo');

は、

INSERT INTO members (code, name, nickname)
 VALUES (
  (select nextval('public.members_code_seq'::text)),
  'foo',
  null
);

になり、ルール内の UPDATE 文は

UPDATE members SET nickname =
 CASE
  WHEN null IS NULL THEN
   'foo'
  ELSE
   null
  END
 WHERE code = (select nextval('public.members_code_seq'::text));

となります。
この「後」で実行されるわけですから、INSERTの nextval() では 
1 が、UPDATE(ルール)の nextval() では 2 がそれぞれ返ります。

> 僕の理解では、NEWというキーワードは
> 「現在INSERT又はUPDATEしたレコードを格納している仮想テーブル」

PL/pgSQL の NEW ではそうなります(と思います)。




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