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

Postgres-Insert-In-View-Regel mit Returning-Klausel

Sie sind viel besser dran, wenn Sie ein INSTEAD OF INSERT verwenden hier auslösen:

CREATE FUNCTION MyFuncName() RETURNS trigger AS $$
DECLARE
  id integer;
BEGIN
  INSERT INTO tableA (time) VALUES COALESCE(NEW.time, NOW()) RETURNING aPrimaryKey INTO id;
  INSERT INTO tableB (aPrimaryKey, someCol1) VALUES (id, NEW.someValue);
  RETURN NEW;
END; $$ LANGUAGE PLPGSQL;

CREATE TRIGGER MyView_on_insert INSTEAD OF INSERT ON MyView
  FOR EACH ROW EXECUTE PROCEDURE MyFuncName();

Den aktuellen Wert einer Sequenz zu überprüfen, um zu sehen, was in eine andere Tabelle eingefügt wurde, ist schlecht schlecht schlecht trainieren. Tun Sie es nicht, auch wenn Sie hier in einer einzigen Transaktion sind.

Sie sind verwirrt über das Problem RETURNING Informationen, weil ich auch verwirrt bin, wenn ich Ihre Frage lese. Verwenden Sie innerhalb einer Funktion den INTO -Klausel zum Füllen lokal deklarierter Variablen zum Speichern von Datensatzwerten, die Sie dann in nachfolgenden Anweisungen verwenden können. Verwenden Sie außerhalb einer Funktion den RETURNING -Klausel wie in Ihrem obersten Code-Snippet.