Re: Sequence skipping values - Mailing list pgsql-general

From Michael Fuhr
Subject Re: Sequence skipping values
Date
Msg-id 20060211020844.GA18127@winnie.fuhr.org
Whole thread Raw
In response to Re: Sequence skipping values  (Jean-Christophe Roux <jcxxr@yahoo.com>)
Responses Re: Sequence skipping values  (Jean-Christophe Roux <jcxxr@yahoo.com>)
List pgsql-general
On Fri, Feb 10, 2006 at 03:27:23PM -0800, Jean-Christophe Roux wrote:
> The table with the  id not incrementing by 1 as I expected is named topics.
>
> I have three  other tables that contain rules that on insert into those
> tables, some  fields of the table Topic should be updated.
> Each of those three tables  contain a column that refer to topics.id as a
> foreign key.
> Those three  columns contain id automatically generated by sequences and I
> have not  observed any problem

The word "rules" attracts attention; questions about sequences being
incremented multiple times due to rules appear in the lists regularly.
The problem is that where you might think the rule uses a value it's
really using an expression, so each time you use the "value" in the
rule you're evaluating the expression again.  Example:

CREATE TABLE foo (id serial);
CREATE TABLE bar (id1 integer, id2 integer, id3 integer);

CREATE RULE foorule AS ON INSERT TO foo
  DO ALSO INSERT INTO bar VALUES (NEW.id, NEW.id, NEW.id);

INSERT INTO foo DEFAULT VALUES;

SELECT * FROM foo;
 id
----
  1
(1 row)

SELECT * FROM bar;
 id1 | id2 | id3
-----+-----+-----
   2 |   3 |   4
(1 row)

When the rule rewrote the query it didn't use

  INSERT INTO bar VALUES (1, 1, 1)

but rather

  INSERT INTO bar VALUES (nextval('foo_id_seq'), nextval('foo_id_seq'),
                          nextval('foo_id_seq'))

because NEW.id evaluates to a nextval expression, not to the result
of that expression.

If you post the table definitions as Steve requested we'll be able
to see whether the above is indeed what's happening.

--
Michael Fuhr

pgsql-general by date:

Previous
From: Steve Crawford
Date:
Subject: Re: Sequence skipping values
Next
From: Jean-Christophe Roux
Date:
Subject: Re: Sequence skipping values