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

Kawasaki Yusuke u-suke @ kawa.net
2007年 3月 19日 (月) 20:30:45 JST


川崎です。RESありがとうございます。(未解決)

On 3/19/07, koyama <mlus @ hintmark.com> wrote:
> シリアルだと、勝手に振ってしまうので、
> CREATE TABLE dst ( id INTEGER , val text );
> ではどうですか?

これでも、やはり2回インクリメントになってしまうようなのです。

CREATE TABLE src ( id int, val text );
CREATE TABLE dst ( id int, val text );
CREATE SEQUENCE ss_seq;
CREATE OR REPLACE RULE rule_src2dst_ins AS ON INSERT TO src
    DO INSERT INTO dst VALUES ( NEW.id, NEW.val );
INSERT INTO src VALUES ( nextval('ss_seq'), 'HELLO' );

SELECT * FROM src;
 id |  val
----+-------
  1 | HELLO

SELECT * FROM dst;
 id |  val
----+-------
  2 | HELLO ←次の nextval() になってしまう


On 3/19/07, ISHIDA Akio <iakio @ mono-space.net> wrote:
> 試してませんが、実行結果を見るかぎりでは、
>  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'とか書きたくない、という
> # 話ですか?

これだと、複数レコードを INSERT したときに最後のシリアル値になってしまうようです。

CREATE TABLE src ( id serial, val text );
CREATE TABLE dst ( id serial, val text );
CREATE OR REPLACE RULE rule_src2dst_ins AS ON INSERT TO src
    DO INSERT INTO dst VALUES ( currval('src_id_seq'), NEW.val );
INSERT INTO src ( val ) VALUES ( 'HELLO' );
INSERT INTO src ( val ) VALUES ( 'WORLD' );
INSERT INTO src ( val ) SELECT val FROM dst; -- 複数行を一括 INSERT する

eucjp_db=# SELECT * FROM src;
 id |  val
----+-------
  1 | HELLO
  2 | WORLD
  3 | HELLO
  4 | WORLD

eucjp_db=# SELECT * FROM dst;
 id |  val
----+-------
  1 | HELLO
  2 | WORLD
  4 | HELLO ←最後の currval になってしまう
  4 | WORLD


-- 
川崎 有亮 Kawasaki Yusuke
株式会社リクルート
事業開発室 R&Dユニット ローカルサーチグループ
〒104-8001 東京都中央区銀座8-4-17 GINZA8ビル 9F
http://map.doko.jp/index.jsp/lm=G8/zm=9/
TEL: 03-3575-6220 (内線:W31-6220) FAX: 03-3575-7201
http://www.kawa.net/



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