Foreign Key constraints mit ACTION CASCADE bei M:N Beziehungen

Hallo,

ich habe mir ein Beispiel für foreign key constraints bei M:N relationen gemacht:

CREATE TABLE child
(
  "name" character varying(32),
  id serial NOT NULL
);

CREATE TABLE parent
(
  "name" character varying(32),
  id serial NOT NULL
);

CREATE TABLE relParentChild
(
  id_child bigint,
  id_parent bigint
);

Hier sind meine Testdaten:

insert into child (name) values ('hensel');
insert into child (name) values ('gretel');
insert into child (name) values ('waise');

insert into parent (name) values ('Karl');
insert into parent (name) values ('Maria');
insert into parent (name) values ('noKids');

-- karl und maria haben zwei kinder hensel und gretel
insert into relParentChild (id_child, id_parent) values (
 (select id from child where name = 'hensel'),
 (select id from parent where name = 'Maria'));
insert into relParentChild (id_child, id_parent) values (
 (select id from child where name = 'hensel'),
 (select id from parent where name = 'Karl'));

insert into relParentChild (id_child, id_parent) values (
 (select id from child where name = 'gretel'),
 (select id from parent where name = 'Maria'));
insert into relParentChild (id_child, id_parent) values (
 (select id from child where name = 'gretel'),
 (select id from parent where name = 'Karl'));

Nun möchte ich gerne realisieren, dass wenn ein Elternteil gelöscht wird alle Kinder mit gelöscht werden:

Das geht so:

create rule delchilds as
  on delete to parent 
  do also
   (delete from child where id in 
     (select id_child from relParentChild where id_parent = OLD.id)
   );
   
delete from parent where name = 'Karl';
select name, id from child union ALL select name, id from parent;

Es verbleiben:
Maria, noKids und waise

Soweit funktioniert das Ganze sehr schön, die Integrität bleibt erhalten. Nun möchte ich aber noch etwas kosmetisches machen:

Gibt es eine Möglichkeit auch Maria zu löschen, deren Kinder gelöscht wurden aufgrund dem Löschen von Karl?

Meine andere Frage ist: Geht das ganze auch one rule rewriting, also mit standard SQL?

Vielen Dank,
Tobias

Welche Version ist am Start?

Seit 8.4 haben wir rekursive Abfragen, damit sollte das einfacher abbildbar sein.

Zur Maria: die hat ja auch wieder Eltern. Sind die auch zu löschen, wenn sie keine weiteren Kinder mehr hat? Und was ist mit Leuten, die kinderlos sind?


Andreas

Hallo Andreas,

ich verwende hier am Arbeitsplatz 8.4, allerdings kann ich das im Produktivsystem nicht einsetzten, da wir da noch auf 8.3 sind. Ich werde mir auf jeden Fall die rekursiven Abfragen ansehen.

Nun die Namen waren nur für das Beispiel. Maria hat in meinem Objektmodell keine Eltern. Eigentlich müsste ich sie Eva nennen:-)

Vielen Dank,
Tobias