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/

---------------------------(end of broadcast)---------------------------
TIP 6: Have you searched our list archives?

               http://archives.postgresql.org

Reply via email to