Vaše otázka ponechává prostor pro interpretaci. Jak tomu rozumím, chcete RETURNING
klauzule INSERT
příkaz k vrácení hodnoty primárního klíče generovaného sekvencí.
Existují i jiné způsoby, jak toho dosáhnout. Stejně jako použití nextval()
získat další id
ze sekvence předem a vložte řádek s id
napsáno.
NEBO currval()
/ lastval()
chcete-li získat naposledy získanou hodnotu pro sekvenci / jakoukoli sekvenci v aktuální relaci. Více v této související odpovědi:
PostgreSQL další hodnota sekvencí?
Můžete také použít RULE ... INSTEAD ..
pro tento účel.
Ale abych odpověděl na vaši otázku – pokud je to ve skutečnosti vaše otázka:lze to provést pomocí dvou spouštěčů . Jeden BEFORE
, jeden AFTER INSERT
.Oba jsou spuštěny v jedné transakci na definici, takže fiktivní řádek ve vaší první tabulce nikdy není viditelný pro nikoho (kromě spouštěčů).
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();
Zavolejte v 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)