X-Original-To: pgsql-sql-postgresql.org@localhost.postgresql.org Received: from localhost (unknown [200.46.204.144]) by svr1.postgresql.org (Postfix) with ESMTP id 9A60B3A4646 for ; Wed, 27 Oct 2004 15:12:03 +0100 (BST) Received: from svr1.postgresql.org ([200.46.204.71]) by localhost (av.hub.org [200.46.204.144]) (amavisd-new, port 10024) with ESMTP id 64049-04 for ; Wed, 27 Oct 2004 14:11:53 +0000 (GMT) Received: from megazone.bigpanda.com (megazone.bigpanda.com [64.147.171.210]) by svr1.postgresql.org (Postfix) with ESMTP id AFF953A1D8A for ; Wed, 27 Oct 2004 15:11:56 +0100 (BST) Received: by megazone.bigpanda.com (Postfix, from userid 1001) id 7F472358A2; Wed, 27 Oct 2004 07:11:25 -0700 (PDT) Received: from localhost (localhost [127.0.0.1]) by megazone.bigpanda.com (Postfix) with ESMTP id 65E47358A1; Wed, 27 Oct 2004 07:11:25 -0700 (PDT) Date: Wed, 27 Oct 2004 07:11:25 -0700 (PDT) From: Stephan Szabo To: "Dmitry P. Ovechkin" Cc: pgsql-sql@postgresql.org Subject: Re: RULE and default nextval() column In-Reply-To: <417FA067.5030506@inpris.ru> Message-ID: <20041027071014.B35265@megazone.bigpanda.com> References: <417FA067.5030506@inpris.ru> MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-Virus-Scanned: by amavisd-new at hub.org X-Spam-Status: No, hits=0.0 tagged_above=0.0 required=5.0 tests= X-Spam-Level: X-Archive-Number: 200410/195 X-Sequence-Number: 19298 On Wed, 27 Oct 2004, Dmitry P. Ovechkin wrote: > Hello. > I'mtrying to implement history tables using rules. > I have > test_table > ---------- > create sequence history_seq start 1; > create sequence test_sequence; > # source table > drop table test_table; > create table test_table ( > i integer default nextval('test_sequence'), > c character(10) > ); > # history table > create table test_table_history ( > hist integer default nextval('history_seq'), > i integer, > c character(10) > ); > # rule to save history > create rule test_table_history_insert as on insert to test_table do > insert into test_table_history values ( nextval('history_seq'), > new.i, > new.c > ); > # > Then I try to insert into test_table; > test=> insert into test_table values( nextval('test_sequence'), 'a'); > INSERT 3299176 1 > test=> insert into test_table (c) values('a'); > INSERT 3299178 1 > drweb=> select * from test_table; > i | c > ---+------------ > 1 | a > 3 | a > (2 rows) > > test=> select * from test_table_history; > hist | i | c > ------+---+------------ > 1 | 2 | a > 2 | 4 | a > (2 rows) > > ========== > Problem is : value of "i" field increments during insertion into both > test_table and test_table history. > This also happens if I omit "i" in insert statement and let it be filled > by default. > Can something be done to avoid it? Pretty much the only real answer is to use a trigger rather than a rule. Rules are basically like macro expansions and have many of the same problem with side effects that macros do.