Pertanyaan Anda menyisakan ruang untuk interpretasi. Cara saya memahaminya, Anda menginginkan RETURNING
klausa dari INSERT
perintah untuk mengembalikan nilai kunci utama yang dihasilkan oleh suatu urutan.
Ada cara lain untuk mencapai ini. Seperti menggunakan nextval()
untuk mendapatkan id
berikutnya dari urutan sebelumnya dan masukkan baris dengan id
dieja.
ATAU currval()
/ lastval()
untuk mendapatkan nilai yang paling baru diperoleh untuk urutan / urutan apa pun di sesi saat ini. Lebih lanjut dalam jawaban terkait ini:
PostgreSQL nilai urutan berikutnya?
Anda juga bisa menggunakan RULE ... INSTEAD ..
untuk tujuan ini.
Namun, untuk menjawab pertanyaan Anda - jika memang itu pertanyaan Anda:dapat dilakukan dengan menggunakan dua pemicu . Satu BEFORE
, satu AFTER INSERT
.Keduanya diaktifkan dalam satu transaksi per definisi, jadi baris hantu di tabel pertama Anda tidak pernah terlihat oleh siapa pun (kecuali pemicu).
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();
Panggil 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)