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