Inherit: Einfügen eines Parent-Satz in die Child-Tabelle (z.B. Stadt nach Hauptstadt)

Gegeben sind eine Haupttabelle stadt und eine mit Inherit verbundene Child-Tabelle hauptstadt.

– Erstellen der Tabelle stadt
CREATE TABLE test.stadt
(
id integer NOT NULL,
stadt character varying(32),
land character varying(32),
CONSTRAINT primkey PRIMARY KEY (id)
)
WITH OIDS;

– Constraint: test.stadt_primkey

ALTER TABLE test.stadt
ADD CONSTRAINT primkey_stadt PRIMARY KEY(id);

– Erstellen der Child-Tabelle hauptstadt

CREATE TABLE test.hauptstadt
(
– Vererbt: id integer NOT NULL,
– Vererbt: stadt character varying(32),
– Vererbt: land character varying(32),
zusatz character varying(32),
CONSTRAINT primkey_hauptstadt PRIMARY KEY (id)
) INHERITS (test.stadt)
WITH OIDS;

– Constraint: test.primkey_hauptstadt

ALTER TABLE test.hauptstadt
ADD CONSTRAINT primkey_hauptstadt PRIMARY KEY(id);

– Jetzt werden zwei Städte eingefügt

insert into test.stadt (id, stadt, land)
values (1, ‘Berlin’, ‘D’)

insert into test.hauptstadt (id, stadt, land, zusatz)
values (2, ‘Bonn’, ‘D’, ‘klein’)

– Soweit, so gut.
– Das Problem der Wiedervereinigung:

– Bonn ist keine Hauptstadt mehr, muß also aus Hauptstadt, aber nicht aus Stadt gelöscht werden.

delete from only test.hauptstadt where id = 2

– O.K.: Bonn ist nicht mehr in hauptstadt enthalten, wohl aber in stadt.

\

– Mein Problem: Berlin ist jetzt Hauptstadt
– Wie lautet das SQL-Statement?

  1. insert into only …
    geht nicht, da das Schlüsselwort only nicht zulässig ist.

  2. Berlin aus stadt löschen und in hauptstadt neu einfügen geht nicht wegen weiterer referentieller Integrität.

  3. update test.hauptstadt set zusatz = ‘abc’ where id = 1
    oder auch
    update only test.hauptstadt set zusatz = ‘abc’ where id = 1
    geht nicht, da Berlin noch keine Haupstadt ist

  4. update test.stadt set zusatz = ‘abc’ where id = 1
    geht nicht, da zusatz keine Spalte aus stadt ist.

Wo liegt der Fehler, wer kann helfen?

Ich hab mal versucht, das so nachzuvollziehen…

– Soweit, so gut.
– Das Problem der Wiedervereinigung:

Problem schon mal, daß es Syntaxfehler gab, wegens fehlender ‘;’ und mehrfach definierten constraints. Egal.

– Bonn ist keine Hauptstadt mehr, muß also aus Hauptstadt, aber nicht aus Stadt gelöscht werden.

delete from only test.hauptstadt where id = 2

– O.K.: Bonn ist nicht mehr in hauptstadt enthalten, wohl aber in stadt.

Nein:

test=# select * from stadt ;
 id | stadt  | land
----+--------+------
  1 | Berlin | D
  2 | Bonn   | D
(2 rows)

Time: 0.971 ms
test=*# select * from hauptstadt ;
 id | stadt | land | zusatz
----+-------+------+--------
  2 | Bonn  | D    | klein
(1 row)

Time: 1.064 ms
test=*#
test=*# delete from only test.hauptstadt where id = 2;
DELETE 1
Time: 1.660 ms
test=*# select * from stadt ;
 id | stadt  | land
----+--------+------
  1 | Berlin | D
(1 row)




– Mein Problem: Berlin ist jetzt Hauptstadt
– Wie lautet das SQL-Statement?

Sorry. Ich …

  1. … kann dein Bleistift nicht nachvollziehen
  2. … habe in Zusammenhang mit Inheritance schon von zu vielen Problemen gehört.

Wo liegt der Fehler, wer kann helfen?

Okay, nicht das, was Du erwartet hast, aber IMHO funktioniert Inheritance unter PG nicht so, wie man es erwartet. Vielleicht findet sich wer, der es besser bringt. Ich hab lange mit der Antwort gewartet, aber es hat auch kein anderer geantwortet. Sorry.

Andreas