[pgsql-jp: 38171] Re: RULE〜ON INSERT と serial 型

ISHIDA Akio iakio @ mono-space.net
2007年 3月 19日 (月) 12:27:46 JST


こんにちは。石田@苫小牧市です。

07/03/18 に Kawasaki Yusuke<u-suke @ kawa.net> さんは書きました:
> 川崎です。こんにちは。
>
> RULE〜ON INSERT 時の serial 型の動作について、教えて下さい。
> 以下のような2つのテーブルがある構成で、src テーブルの id・val の値を
> リアルタイムに dst テーブルに反映していきたいとします。
>
> CREATE TABLE src ( id serial, val text );
> CREATE TABLE dst ( id serial, val text );
>
> 実際には、コピー以外の操作もあるので、ビューでは実現できません。
> 具体的には、src に INSERT されれば、その id・val を dst にも INSERT して、
> src が UPDATE されれば、dst でも同じ id の val を UPDATE して、
> src から DELETE されれば、dst でも同じ id のレコードを DELETE します。
> これを実現するため、以下の3つのルールを定義しました。
>
> CREATE OR REPLACE RULE rule_src2dst_ins AS ON INSERT TO src
>     DO INSERT INTO dst VALUES ( NEW.id, NEW.val );
> CREATE OR REPLACE RULE rule_src2dst_upd AS ON UPDATE TO src
>     DO UPDATE dst SET val = NEW.val WHERE dst.id = NEW.id;
> CREATE OR REPLACE RULE rule_src2dst_del AS ON DELETE TO src
>     DO DELETE FROM dst WHERE dst.id = OLD.id;
>
> ON UPDATE と ON DELETE のルールは期待通り動作しているように見えます。
> しかし INSERT 時は、src_id_seq のシーケンスが1つカウントアップして、
> dst 側の id には src 側の id+1 の値が入ってしまします。

試してませんが、実行結果を見るかぎりでは、
 CREATE OR REPLACE RULE rule_src2dst_ins AS ON INSERT TO src
     DO INSERT INTO dst VALUES (currval('src_id_seq'), NEW.val );

で上手くいきそうな気がします。
# もしかして、沢山定義するので'src_id_seq'とか書きたくない、という
# 話ですか?

8.2ならinsteadルールで
insert into dst insert into src(t) values('A') returning *;
とか書けそうな気もするけどうまくいかない。


-- 
ISHIDA Akio <iakio @ mono-space.net/ishida @ cycleof5th.com>



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