sql >> Database >  >> RDS >> PostgreSQL

PostgreSQL-trigger retourneert niets

Uw vraag laat ruimte voor interpretatie. Zoals ik het begrijp, wil je de RETURNING clausule van de INSERT commando om de waarde van de primaire sleutel te retourneren die door een reeks is gegenereerd.

Er zijn andere manieren om dit te bereiken. Zoals het gebruik van nextval() om de volgende id . te krijgen uit de reeks vooraf en voeg de rij in met de id uitgeschreven.
OF currval() / lastval() om de meest recent verkregen waarde voor een reeks / elke reeks in de huidige sessie te krijgen. Meer in dit gerelateerde antwoord:
PostgreSQL volgende waarde van de reeksen?

U kunt ook een RULE ... INSTEAD .. voor dit doel.

Maar om uw vraag te beantwoorden - als dat uw vraag is:het kan worden gedaan door twee triggers te gebruiken . Een BEFORE , één AFTER INSERT .Beide worden per definitie in één transactie geactiveerd, dus de spookrij in uw eerste tafel is voor niemand zichtbaar (behalve de triggers).

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

Bel in psql:

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)



  1. Voorbereide params LIKE-instructie Werkt niet met SQLSRV

  2. Enkele rijgegevens converteren naar een enkele kolom in Oracle

  3. Hoe de prestaties van MySQL te benchmarken met SysBench

  4. docker mysql op andere poort