PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

PostgreSQL-Regeln und nextval()/serial-Problem (sehr PostgreSQL-spezifisch)

Aus den Dokumenten http://www.postgresql.org/docs/8.4/ static/rules.html

also schreibt es zuerst die Abfragen um, ohne etwas auszuführen.

Sie können es zum Laufen bringen, wenn Sie nicht mehrere Datensätze gleichzeitig einfügen:

create or replace rule ct_i_children1 as
  on insert to Children1
  do instead (
    insert into Parents(id, attribute1, type)
      values(nextval('parents_id_seq'), new.attribute1, 'Child1');
    insert into Partial_Children1(id, attribute2, type)
      values(currval('parents_id_seq'), new.attribute2, 'Child1');
  );

Dann können Sie Folgendes tun:

insert into Children1 (attribute1, attribute2) values ('a1', 'a2');
insert into Children1 (attribute1, attribute2) values ('b1', 'b2');

aber nicht

insert into Children1 (attribute1, attribute2)
  values ('a1', 'a2'),
         ('b1', 'b2');

Sie sollten das Regelsystem also wirklich nicht mit kniffligen currval()-Aufrufen verwenden.

Werfen Sie zusätzlich einen Blick auf die Kommentare auf diesen Seiten:

Noch ein Tipp:Der Support auf der Postgresql-Mailingliste ist genauso hervorragend wie die Datenbank-Engine selbst!

Und nebenbei:Wussten Sie, dass postgresql Vererbung out-of-the-box unterstützt?

Zusammenfassung:Sie sollten Trigger verwenden oder das Einfügen mehrerer Zeilen vermeiden!