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

किसी अन्य तालिका से हटाए जाने पर PostgreSQL को तालिका में एक पंक्ति कैसे सम्मिलित करें?

एक ट्रिगर फ़ंक्शन लिखें। कुछ इस तरह:

CREATE OR REPLACE FUNCTION trg_backup_row()
  RETURNS trigger AS
$BODY$
BEGIN

INSERT INTO other_tbl
SELECT (OLD).*, t.other_col                -- all columns of from old table
-- SELECT OLD.col1, OLD.col2, t.other_col  -- alternative: some cols from old tbl
FROM   third_tbl t
WHERE  t.col = OLD.col  -- link to third table with info from deleted row
AND    <unique_condition_to_avoid_multiple_rows_if_needed>;

RETURN NULL;

END;
$BODY$
  LANGUAGE plpgsql VOLATILE;

और एक ट्रिगर ON DELETE . इस तरह:

CREATE TRIGGER delaft
  AFTER DELETE
  ON tbl
  FOR EACH ROW
  EXECUTE PROCEDURE trg_backup_row();

मुख्य तत्व

  • इसे ट्रिगर डिलीट करने के बाद सबसे अच्छा बनाएं और प्रत्येक पंक्ति के लिए

  • पुरानी तालिका से सभी कॉलम वापस करने के लिए सिंटैक्स का उपयोग करें (OLD).* . समग्र प्रकारों को एक्सेस करने के बारे में मैनुअल देखें . वैकल्पिक रूप से पुराना।* मान्य सिंटैक्स भी है, क्योंकि पुराना FROM . में जोड़ा जाता है स्पष्ट रूप से खंड। VALUES . के लिए व्यंजक यह (OLD) होना चाहिए।* , यद्यपि। पसंद:

    INSERT INTO other_tbl
    VALUES((OLD).*, some_variable)
    
  • आप किसी अन्य तालिका से मान शामिल कर सकते हैं जैसे मैं प्रदर्शित करता हूं। बस एक पंक्ति प्राप्त करना सुनिश्चित करें, या आप कई प्रविष्टियाँ बनाते हैं।

  • जैसे ही ट्रिगर सक्रिय होता है बाद घटना, फ़ंक्शन रिटर्न NULL कर सकता है ।

दृश्यता के बारे में

@couling की सतर्क टिप्पणी के जवाब में।

जबकि विदेशी कुंजियों को DEFERRED , यह केवल सत्यनिष्ठा जांच को स्थगित करेगा, स्वयं विलोपन को नहीं। पंक्तियाँ जो ट्रिगर में हटा दी जाती हैं, जो हाथ में एक से पहले निष्पादित होती हैं या डिलीट कैस्केड पर . द्वारा विदेशी कुंजियाँ अब और दिखाई नहीं देंगी उस समय यह हटाने के बाद ट्रिगर कहा जाता है। (यह सब स्पष्ट रूप से एक लेन-देन में होता है। इनमें से कोई भी विवरण अन्य लेनदेन के लिए मायने नहीं रखता है, जो सभी या कोई भी प्रभाव नहीं देखेगा। एमवीसीसी मॉडल और लेनदेन अलगाव ।)

इसलिए, यदि आप अपने INSERT . में इस तरह के आधार पर पंक्तियों से मान शामिल करना चाहते हैं , इस ट्रिगर को पहले . कॉल करना सुनिश्चित करें वे पंक्तियाँ हटा दी जाती हैं।

हटाने से पहले . आपको यह ट्रिगर करना पड़ सकता है ।

या इसका मतलब यह हो सकता है कि आपको अपने ट्रिगर्स को उसी के अनुसार ऑर्डर करना होगा, पहले ट्रिगर बाद . से पहले आते हैं ट्रिगर, जाहिर है। और समान स्तर पर ट्रिगर वर्णमाला क्रम में क्रियान्वित किए जाते हैं ।

हालांकि, जब तक मैं यहां बहुत सटीक हूं, मैं पंक्ति में किए गए परिवर्तनों (या पंक्तियों के आधार पर) को अन्य पहले में भी जोड़ सकता हूं ट्रिगर भी केवल तभी दिखाई देते हैं जब उन्हें पहले . कहा जाता है यह वाला।

मेरी सलाह है कि इसे बाद बनाएं ट्रिगर इसलिए था क्योंकि यह जटिलताओं के लिए कम प्रवण होता है और सस्ता होता है यदि अन्य ट्रिगर DELETE को रद्द (रोल बैक) कर सकता है ऑपरेशन के आधे रास्ते - जब तक उपरोक्त में से कोई भी लागू नहीं होता है।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. जेपीए विरासत @EntityGraph में उपवर्गों के वैकल्पिक संघ शामिल हैं

  2. PostgreSQL पर बेहिसाब एक्सटेंशन बनाते समय त्रुटि

  3. पोस्टग्रेज:एक डीबी के सार्वजनिक स्कीमा से दूसरे डीबी के नए स्कीमा में डेटा स्थानांतरित करने का सबसे अच्छा तरीका

  4. मैं कॉपी कमांड का उपयोग करके पोस्टग्रेज में डेटा को एक टेबल से दूसरी टेबल में कैसे कॉपी करूं?

  5. PostgreSQL के लिए क्लाउड बैकअप विकल्प