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

PostgreSQL-Trigger gibt nichts zurück

Deine Frage lässt Interpretationsspielraum. So wie ich es verstehe, wollen Sie den RETURNING -Klausel von INSERT Befehl, um den Wert des von einer Sequenz generierten Primärschlüssels zurückzugeben.

Es gibt andere Möglichkeiten, dies zu erreichen. Wie die Verwendung von nextval() um die nächste id zu erhalten vorher aus der Sequenz und fügen die Zeile mit der id ein ausgeschrieben.
ODER currval() / lastval() um den zuletzt erhaltenen Wert für eine Sequenz / eine beliebige Sequenz in der aktuellen Sitzung zu erhalten. Mehr in dieser verwandten Antwort:
PostgreSQL nächster Wert der Sequenzen?

Sie könnten auch eine RULE ... INSTEAD .. verwenden zu diesem Zweck.

Aber um Ihre Frage zu beantworten – falls das tatsächlich Ihre Frage ist:Es kann durch die Verwendung von zwei Triggern erreicht werden . Ein BEFORE , ein AFTER INSERT .Beide werden per Definition in einer Transaktion ausgelöst, sodass die Phantomzeile in Ihrer ersten Tabelle für niemanden sichtbar ist (außer den Auslösern).

Demo:

CREATE TABLE x (
  id serial PRIMARY KEY  -- note the serial col.
 ,name text
);

CREATE TABLE y (
  id integer PRIMARY KEY
 ,name text
);


CREATE OR REPLACE FUNCTION trg_x_insbef()
  RETURNS trigger AS
$func$
BEGIN
  INSERT INTO y SELECT (NEW).*;  -- write to other table
  RETURN NEW;
END
$func$ LANGUAGE plpgsql;

CREATE TRIGGER insbef
  BEFORE INSERT ON x
  FOR EACH ROW EXECUTE PROCEDURE trg_x_insbef();


CREATE OR REPLACE FUNCTION trg_x_insaft()
  RETURNS trigger AS
$func$
BEGIN
  DELETE FROM x WHERE id = NEW.id; -- delete row again.
  RETURN NULL;
END
$func$ LANGUAGE plpgsql;

CREATE TRIGGER insaft
  AFTER INSERT ON x
  FOR EACH ROW EXECUTE PROCEDURE trg_x_insaft();

Rufen Sie psql auf:

db=# INSERT INTO x (name) values('phantom') RETURNING id;
 id
----
  1
(1 row)

INSERT 0 1

db=# SELECT * FROM x;
 id | name
----+------
(0 rows)


db=# SELECT * FROM y;
 id |  name
----+---------
  1 | phantom
(1 row)