Search Postgresql Archives

Problem with REFERENCES on INHERITS

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi.

I have encountered a problem with references when using INHERITS (on
Postgres 9.1/9.2).  Could someone please explain why this occurs.

Consider this example.

CREATE TABLE primate
(
   id SERIAL PRIMARY KEY,
   name TEXT,
   tale TEXT
);


CREATE TABLE chimp
(
    human_friend TEXT
) INHERITS(primate);

INSERT INTO chimp(name, tale, human_friend) VALUES
    ('Cheetah', 'Curly', 'Tarzan');

INSERT INTO primate(name, tale) VALUES
    ('King Julien', 'Move it');

SELECT * FROM primate;

==>
 id |    name     |  tale
----+-------------+---------
  2 | King Julien | Move it
  1 | Cheetah     | Curly
(2 rows)

CREATE TABLE banana_stash
(
    id SERIAL,
    primate_id INTEGER REFERENCES primate(id),
    qty INTEGER
);

INSERT INTO banana_stash(primate_id, qty) VALUES
    (1, 17);

==>
ERROR:  insert or update on table "banana_stash" violates foreign key
constraint "banana_stash_primate_id_fkey"
DETAIL:  Key (primate_id)=(1) is not present in table "primate".

INSERT INTO banana_stash(primate_id, qty) VALUES
    (2, 22);

==>
INSERT 0 1

SELECT * FROM banana_stash;

==>
 id | primate_id | qty
----+------------+-----
  2 |          2 |  22
(1 row)

My problem:  could someone please explain the semantics and why this
behaviour makes sense -- or is it a design error or bug?

To sum up the issue:
    - I insert into the derived table (chimp) and get id 1
    - I insert into the base table (primate) and get id 2
    - I have a foreign key constraint in banana_stash to the
      base table p.k. primate(id)
    - inserting to banana_stash with reference to id 2 is okay
    - inserting to banana_stash with reference 1 gives error
    - both ids 1 and 2 in table primate are supposed to be valid

So why does the one case give an error when the other does not?

Also, is there a way to solve this problem (i.e. remove the error)
without simply chopping out the REFERENCES clause from banana_stash?

-Will


-- 
Sent via pgsql-general mailing list (pgsql-general@xxxxxxxxxxxxxx)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-general




[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Postgresql Jobs]     [Postgresql Admin]     [Postgresql Performance]     [Linux Clusters]     [PHP Home]     [PHP on Windows]     [Kernel Newbies]     [PHP Classes]     [PHP Books]     [PHP Databases]     [Postgresql & PHP]     [Yosemite]
  Powered by Linux