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:
- http://www.postgresql.org/docs/ 8.2/interactive/rules-update.html
- http://archives.postgresql.org/pgsql- sql/2004-10/msg00195.php
- http://archives.postgresql.org/pgsql- general/2009-06/msg00278.php
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!