Trigger After Insert

Hallo,

ich möchte nach einem insert einen trigger ausführen, der in einer zweiten Tabelle einen Satz anlegt, und die id aus dem neu angelegten Satz in diese 2. Tabelle schreibt.

muster1 {
id,
wert,
}

muster2{
id,
id aus muster 1,
wert,
}

insert bekomme ich hin, aber wie komme ich im trigger an die id aus der 1. Tabelle?
Hat jemand evtl. eine ID?

Danke :astonished:

Du kannst NEW.id oder currval() verwenden.

Andreas

… wobei NEW.id sinnvoller ist, spart einen Funktionsaufruf …

test=*# create table t1 (id serial);
NOTICE:  CREATE TABLE will create implicit sequence "t1_id_seq" for serial column "t1.id"
CREATE TABLE
Zeit: 1,854 ms
test=*# create table t2 (id serial, id_1 int);
NOTICE:  CREATE TABLE will create implicit sequence "t2_id_seq" for serial column "t2.id"
CREATE TABLE
Zeit: 13,114 ms
test=*# create or replace function trg_t1() returns trigger as $$begin insert into t2 values (default, NEW.id); return NEW; end; $$language plpgsql;
CREATE FUNCTION
Zeit: 0,427 ms
test=*# create trigger trg1 after insert on t1 for each row execute procedure trg_t1();
CREATE TRIGGER
Zeit: 0,410 ms
test=*# insert into t1 (id) values (default);
INSERT 0 1
Zeit: 0,610 ms
test=*# select * from t2;
 id | id_1
----+------
  1 |    1
(1 Zeile)

Zeit: 1,024 ms

test=*# insert into t1 (id) values (10);
INSERT 0 1
Zeit: 0,249 ms
test=*# select * from t2;
 id | id_1
----+------
  1 |    1
  2 |   10
(2 Zeilen)

Andreas

oh ja! Danke.
Klappt :-}

Nachtrag:

der Vorschlag mit currval() ist doof, weil dies schiefgehen würde (sogar mit Fehler), wenn nicht die Sequenz befragt wird, sondern ein Wert vorgegeben.

Und falls Marko Tiikkaja sein wCTE in 9.1 bekommt, dann gäbe es sogar einen Weg, dies mit einem einzigen SQL-Befehl und ohne TRIGGER hinzubekommen.

Andreas