Thread: Foreign key referencing subclasses.

Foreign key referencing subclasses.

From
Johannes Grødem
Date:
Hi,

it seems I can't have a foreign key that references some subclass.  Postgres
says it can't figure out what its primary key is.  The primary key is defined
in the superclass.

I have something like this:

CREATE TABLE resource_record( rrid SERIAL -- etc.
);

CREATE TABLE soa_record( -- blah, blah
) INHERITS(resource_record);

CREATE TABLE domain( -- ... soaid REFERENCES soa_record  -- *
);


* = This doesn't work. I can reference resource_record here, but I can not   reference soa_record that way. Referencing
resource_record*doesn't work   either.
 

-- 
johs


Re: Foreign key referencing subclasses.

From
Christof Glaser
Date:
Hi Johannes,

On Thursday, 22. March 2001 15:18, Johannes Grødem wrote:
> Hi,
>
> it seems I can't have a foreign key that references some subclass. 
> Postgres says it can't figure out what its primary key is.  The
> primary key is defined in the superclass.
>
> I have something like this:
>
> CREATE TABLE resource_record(
>   rrid SERIAL
>   -- etc.
> );

There is no primary key for this table. Just write PRIMARY KEY after 
SERIAL.

> CREATE TABLE soa_record(
>   -- blah, blah
> ) INHERITS(resource_record);
>
> CREATE TABLE domain(
>   -- ...
>   soaid REFERENCES soa_record  -- *
> );
>
>
> * = This doesn't work. I can reference resource_record here, but I
> can not reference soa_record that way. Referencing resource_record*
> doesn't work either.

Primary keys as well as other indexes are not inherited, unfortunately. 
You should create the indexes for any subclass manually, like:

CREATE INDEX soa_record_pkey ON soa_record ( rrid );

You could also state the referenced field name (you actually have to, 
if you happen to reference to a non-primary key field):

CREATE TABLE ...soaid  int4  REFERENCES soa_record ( rrid )       ^^^^
Note that SERIAL is actually int4 with automagically created sequences.
You can't leave out the column's type for references.

And note also that referencing to a superclass* (including subclasses) 
does not work for 7.0.x. I think it changes with 7.1 but I'm not sure.
You could create your own triggers, though.

Hope that helps,

Christof.
--          gl.aser . software engineering . internet service      http://gl.aser.de/  . Planckstraße 7 . D-39104
Magdeburg
Tel. +49.391.7 44 77 10 . Fax +49.391.7 44 77 13 . Mobil 0177.77 92 84 3


Re: Foreign key referencing subclasses.

From
Stephan Szabo
Date:
On Thu, 22 Mar 2001, [iso-8859-1] Johannes Gr�dem wrote:

> Hi,
> 
> it seems I can't have a foreign key that references some subclass.  Postgres
> says it can't figure out what its primary key is.  The primary key is defined
> in the superclass.

Unique/primary key doesn't inherit to subclasses.

If you want to reference just soa_record, you can create the unique index
on soa_record.  If you want to do the entire tree, the fk stuff doesn't
support that (issues with inheriting the triggers mostly).




Re: Foreign key referencing subclasses.

From
Johannes Grødem
Date:
>> CREATE TABLE resource_record(
>>   rrid SERIAL
>>   -- etc.
>> );
> There is no primary key for this table. Just write PRIMARY KEY after 
> SERIAL.

There is.  I accidentally left it out in the post.

> CREATE INDEX soa_record_pkey ON soa_record ( rrid );
> You could also state the referenced field name (you actually have to, 
> if you happen to reference to a non-primary key field):

Ok, thanks.  This will work for this case, but I still want to be able
to reference resource_record*.  Will this be possible in later versions?
Inheritance isn't quite as useful if I can't.  Sorry to be such a whiner,
by the way.  PostgreSQL is great.

-- 
johs