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)