Trigger und Referenzen auf Parenttables

hi,
leider hab ich im netz bisher nichmal gefunden, das das überhaupt ein problem ist und somit hoffe ich mal, dass ich nur irgendwas von der falschen seite sehe :?

folgendes Problem:
ich hab nen recht grossen baum aus tabellen, wo immer mehrere tabellen die attribute der übergeordneten erben.
(in der roottabelle steht praktisch nur noch ne id (serial) und nen name)
die einträge in die datenbank mach man fast immer nur in die untersten tabellen.
wenn ich jetzt einen trigger schreiben will für eine tabelle in der mitte, oder auch von aussenstehenden tabellen auf zb die id in der roottabelle nen fkey leg, dann heisst es immer, elemente in den tabellen existieren nicht (oder tie trigger arbeiten nicht)

hintergrund ist, dass die daten physisch nur in die tabellen eingetragen werden, in die man sie einträgt und die elemente der elterntabellen wohl irgendwie nur zeiger? auf die kindtabelle(n) haben und diese zeiger nicht ausreichen, um zb nen fkey zu legen.

… so ist bis jetzt meine sicht der sache …

hat jemand ne idee, wie man das umgehen kann, oder was ich falsch mache?

schon mal im voraus big thanks :!: :wink:

grüsse

ein kleines beispiel zur veranschaulichung:
files hat id und name
images und audios erben von files und haben je ein zusätzliches attribut
extensions steht alleine und hat ne referenz (über ref_files_extensions) zu files


CREATE TABLE files
(
id int4,
name varchar(200),
PRIMARY KEY (id)
) WITHOUT OIDS;

CREATE TABLE images
(
colordept int4
)
INHERITS (files)
WITHOUT OIDS;

CREATE TABLE audios
(
bitrate int4
)
INHERITS (files)
WITHOUT OIDS;

CREATE TABLE extensions
(
id int4,
extension varchar(50),
PRIMARY KEY (id)
) WITHOUT OIDS;

CREATE TABLE ref_files_extensions
(
files_id int4,
extensions_id int4,
FOREIGN KEY (files_id) REFERENCES files (id) ON UPDATE CASCADE ON DELETE CASCADE,
FOREIGN KEY (extensions_id) REFERENCES extensions (id) ON UPDATE CASCADE ON DELETE CASCADE
) WITHOUT OIDS;

INSERT INTO images VALUES (1, ‘Bild’, 256);
INSERT INTO audios VALUES (2, ‘Song’, 44100);
INSERT INTO extensions VALUES (1, ‘bmp’);
INSERT INTO extensions VALUES (2, ‘mp3’);

===========================================

SELECT * FROM files;
==> id’s und namen von images und audios werden gelistet.

INSERT INTO ref_files_extensions VALUES (1, 1);
==>
ERROR: insert or update on table “ref_files_extensions” violates foreign key constraint “ref_files_extensions_files_id_fkey”
DETAIL: Key (files_id)=(1) is not present in table “files”.

ein fkey auf images würde gehen, da dort die id(1) physisch drinliegt.

hi,

sry ich versteh zwar immer noch net genau was du willst aber die meldung ist doch eigentlich klar oder? es gibt keinen datensatz in “files” der die id 1 hat…

cu tb.

SELECT * FROM files;

id(int4) name(varchar)
1 Bild
2 Song

der select befehl sieht das allerdings anders.

dass trigger und fkeys nich funzen seh ich ja und mir is klar warum die nich gehen, ich weiss nur nich, wie ich diesen effekt umgehen kann.

wie setze ich in diesem kleinen beispiel eine abfrage um, gib mir alle files mit der extension bmp? (ich möchte jetzt nicht den selectbefehl für mein nicht funzendes beispiel, sondern mein beispiel abgewandelt, wo ich diesen selectbefehl absetzten kann)

der baum, den ich hier zu bearbeiten hab, ist erheblich grösser und der ist mir leider praktisch vorgegeben (ich darf ihn zwar abändern, aber ich darf kein anderes konzept verwenden und ich hab die sache mit fkeys und trigger hier öfters drin :frowning:

hast du hier irgendwelche denkansätze?
(ich kann die datenbank neugestalten - mit der einzigen vorgabe, die daten sind in baumstruktur abzulegen)

thanks