Votre question laisse place à interprétation. D'après ce que j'ai compris, vous voulez le RETURNING
clause du INSERT
commande pour retourner la valeur de la clé primaire générée par une séquence.
Il existe d'autres moyens d'y parvenir. Comme utiliser nextval()
pour obtenir le prochain id
de la séquence au préalable et insérez la ligne avec le id
épelé.
OU currval()
/ lastval()
pour obtenir la valeur la plus récemment obtenue pour une séquence / toute séquence de la session en cours. Plus dans cette réponse connexe :
Valeur suivante PostgreSQL des séquences ?
Vous pouvez également utiliser une RULE ... INSTEAD ..
à cet effet.
Mais, pour répondre à votre question - si telle est bien votre question :cela peut être fait en utilisant deux déclencheurs . Un BEFORE
, un AFTER INSERT
.Les deux sont déclenchés dans une transaction par définition, de sorte que la ligne fantôme de votre première table n'est jamais visible par personne (sauf les déclencheurs).
Démo :
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();
Appelez 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)