आपका प्रश्न व्याख्या के लिए जगह छोड़ता है। जिस तरह से मैं इसे समझता हूं, आप चाहते हैं कि RETURNING
INSERT
. का खंड अनुक्रम द्वारा उत्पन्न प्राथमिक कुंजी का मान वापस करने का आदेश।
इसे हासिल करने के और भी तरीके हैं। जैसे nextval()
का इस्तेमाल करना
अगला id
प्राप्त करने के लिए अनुक्रम से पहले से और id
. के साथ पंक्ति डालें स्पेलिंग आउट।
या currval()
/ lastval()
वर्तमान सत्र में अनुक्रम/किसी अनुक्रम के लिए सबसे हाल ही में प्राप्त मूल्य प्राप्त करने के लिए। इस संबंधित उत्तर में और अधिक:
PostgreSQL अनुक्रमों का अगला मान?
आप RULE ... INSTEAD ..
. का भी उपयोग कर सकते हैं इस उद्देश्य के लिए।
लेकिन, आपके प्रश्न का उत्तर देने के लिए - यदि वास्तव में, आपका प्रश्न है:यह दो ट्रिगर का उपयोग करके किया जा सकता है . एक BEFORE
, एक AFTER INSERT
.दोनों प्रति परिभाषा एक लेन-देन में सक्रिय हैं, इसलिए आपकी पहली तालिका में प्रेत पंक्ति कभी भी किसी को दिखाई नहीं देती है (ट्रिगर को छोड़कर)।
डेमो:
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();
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)