Câu hỏi của bạn còn chỗ để giải thích. Theo cách hiểu của tôi, bạn muốn RETURNING
mệnh đề của INSERT
lệnh trả về giá trị của khóa chính được tạo bởi một chuỗi.
Có nhiều cách khác để đạt được điều này. Như sử dụng nextval()
để lấy id
tiếp theo từ trình tự trước đó và chèn hàng với id
đánh vần.
HOẶC currval()
/ lastval()
để nhận giá trị thu được gần đây nhất cho một chuỗi / bất kỳ chuỗi nào trong phiên hiện tại. Thêm câu trả lời có liên quan này:
Giá trị tiếp theo của chuỗi PostgreSQL?
Bạn cũng có thể sử dụng RULE ... INSTEAD ..
cho mục đích này.
Tuy nhiên, để trả lời câu hỏi của bạn - nếu đó thực tế là câu hỏi của bạn:có thể thực hiện bằng cách sử dụng hai trình kích hoạt . Một BEFORE
, một AFTER INSERT
. Cả hai đều được kích hoạt trong một giao dịch cho mỗi định nghĩa, vì vậy hàng ảo trong bảng đầu tiên của bạn không bao giờ hiển thị cho bất kỳ ai (ngoại trừ các yếu tố kích hoạ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();
Gọi trong 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)