PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

PostgreSQL ट्रिगर कुछ भी वापस नहीं कर रहा है

आपका प्रश्न व्याख्या के लिए जगह छोड़ता है। जिस तरह से मैं इसे समझता हूं, आप चाहते हैं कि 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)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. पोस्टग्रेज 9.4:प्रत्येक jsonb सरणी परिणाम में सिबलिंग कॉलम शामिल करें

  2. Postgres में फ़ंक्शन ओवरलोडिंग को अक्षम करने का कोई तरीका है

  3. PostgreSQL ट्रिगर और संग्रहीत कार्य मूल बातें

  4. जेनरेट की गई तालिका का पंक्ति प्रतिनिधित्व कैसे प्राप्त करें?

  5. विंडोज 10 पर पोस्टग्रेज पाथ वेरिएबल कैसे सेट करें?