PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Postgres inserisce in vista la regola con clausola di ritorno

È molto meglio usare un INSTEAD OF INSERT attiva qui:

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();

Controllare il valore corrente di una sequenza per vedere cosa è stato inserito in un'altra tabella è bad bad bad la pratica. Anche mentre sei qui con un'unica transazione, non farlo.

Sei confuso riguardo al problema di RETURNING informazioni, perché anch'io sono confuso quando leggo la tua domanda. All'interno di una funzione usa INTO clausola per popolare le variabili dichiarate localmente per contenere i valori del record che è quindi possibile utilizzare nelle istruzioni successive. Al di fuori di una funzione, usa il RETURNING clausola come fai nel tuo snippet di codice più in alto.