Re: Help with transactions

From: Michael Fuhr <mike(at)fuhr(dot)org>
To: Stephen Howie <showie(at)centwire(dot)com>
Cc: pgsql-general(at)postgresql(dot)org
Subject: Re: Help with transactions
Date: 2005-03-23 05:38:49
Message-ID: 20050323053849.GA32993@winnie.fuhr.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

On Mon, Mar 21, 2005 at 10:58:27AM -0500, Stephen Howie wrote:

> I've notice a couple things. I ran a couple test and at first I
> couldn't duplicate my error on some test tables. But I then added
> inheritance to one of the tables and thats when I got the error again.

Are you aware that foreign keys and inheritance don't play well
together? See the comments at the bottom of the following page:

http://www.postgresql.org/docs/8.0/static/ddl-inherit.html

> It looks like there is an error when obtaining the seq id (nextval) from
> the original table and using it on a table that has a foreign key to the
> original table by inserting it into the table that inherits the original
> table, within a transaction. What I think is happening is since the
> insert is on the inherited table the foreign key doesn't see the insert
> into the original table until the transaction is committed.

Have you tested that hypothesis by doing an insert with a foreign
key value that *has* been committed? Reducing the problem to the
simplest possible test case can reveal what's really happening --
the views, rules, and functions might not be relevant to the problem
and they're just adding unnecessary complexity to the investigation.

CREATE TABLE parent (
id integer PRIMARY KEY,
data text NOT NULL
);

CREATE TABLE child (
more_data text NOT NULL
) INHERITS (parent);

CREATE TABLE other (
fkid integer NOT NULL REFERENCES parent
);

BEGIN;
INSERT INTO parent (id, data) VALUES (1, 'foo');
INSERT INTO child (id, data, more_data) VALUES (2, 'bar', 'baz');
COMMIT;

SELECT * FROM parent;
id | data
----+------
1 | foo
2 | bar
(2 rows)

INSERT INTO other (fkid) VALUES (1);
INSERT INTO other (fkid) VALUES (2);
ERROR: insert or update on table "other" violates foreign key constraint "other_fkid_fkey"
DETAIL: Key (fkid)=(2) is not present in table "parent".

I suspect the problem is simply that inheritance has known and
documented limitations with constraints like foreign keys.

> Also, in my original schema I'm getting an increment of 2 every time I
> run nextval. I can't duplicate this yet but I'm looking into it.
> Possibly my error somewhere in the function.

Could be one of the "gotchas" with using rules. Search the archives
for past discussion.

--
Michael Fuhr
http://www.fuhr.org/~mfuhr/

In response to

Browse pgsql-general by date

  From Date Subject
Next Message Scott Frankel 2005-03-23 05:59:23 Re: inherited table and rules
Previous Message Tom Lane 2005-03-23 05:10:20 Re: [GENERAL] contrib module intagg crashing the backend