Din fråga lämnar utrymme för tolkning. Som jag förstår det vill du ha RETURNING
satsen i INSERT
kommando för att returnera värdet på primärnyckeln som genereras av en sekvens.
Det finns andra sätt att uppnå detta. Som att använda nextval()
för att få nästa id
från sekvensen i förväg och infoga raden med id
stavas.
ELLER currval()
/ lastval()
för att få det senast erhållna värdet för en sekvens / valfri sekvens i den aktuella sessionen. Mer i detta relaterade svar:
PostgreSQL nästa värde för sekvenserna?
Du kan också använda en RULE ... INSTEAD ..
för detta ändamål.
Men för att svara på din fråga - om det i själva verket är din fråga:det kan göras genom att använda två utlösare . En BEFORE
, en AFTER INSERT
.Båda aktiveras i en transaktion per definition, så fantomraden i din första tabell är aldrig synlig för någon (förutom 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();
Ring 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)