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

सभी आस्थगित बाधाओं को सेट करें जो अपेक्षित रूप से काम नहीं कर रहे हैं

केवल DEFERRABLE बाधाओं को टाला जा सकता है।

मुझे पहले बेहतर विकल्प सुझाएं:

<एच4>1. INSERT क्रम में

INSERT के अनुक्रम को उल्टा करें बयान और कुछ भी स्थगित करने की आवश्यकता नहीं है। सबसे सरल और तेज़ - यदि संभव हो तो।

<एच4>2. सिंगल कमांड

इसे एकल आदेश में करें . फिर भी कुछ भी स्थगित करने की आवश्यकता नहीं है, क्योंकि गैर-आस्थगित बाधाओं की जाँच की जाती है प्रत्येक आदेश के बाद और CTE को सिंगल कमांड का हिस्सा माना जाता है:

WITH ins1 AS (
   INSERT INTO b(j) VALUES(2)
   )
INSERT INTO a(i) VALUES(2);

इस पर रहते हुए, आप पहले INSERT . के मानों का पुन:उपयोग कर सकते हैं; कुछ मामलों या बहु-पंक्ति सम्मिलनों के लिए सुरक्षित/अधिक सुविधाजनक:

WITH ins1 AS (
   INSERT INTO b(j) VALUES(3)
   RETURNING j
   )
INSERT INTO a(i)
SELECT j FROM ins1;

लेकिन मुझे आस्थगित बाधाओं की आवश्यकता है! (वास्तव में?)

ALTER TABLE b ADD CONSTRAINT fkey_ij FOREIGN KEY (j)
   REFERENCES a (i) MATCH SIMPLE
   ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE;  -- !!!

तब आपका मूल कोड काम करता है (थोड़ा धीमा, क्योंकि आस्थगित बाधाएं लागत जोड़ती हैं)।

db<>fiddle यहां

संबंधित:

मेरा मूल उत्तर मैनुअल उद्धृत :

लेकिन यह भ्रामक था क्योंकि यह केवल "संदर्भात्मक क्रियाओं" पर लागू होता है, अर्थात ON UPDATE या ON DELETE संदर्भित तालिका में पंक्तियों के लिए। मामला उनमें से एक नहीं है - जैसा कि @zer0hedge बताया



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. रेल:पोस्टग्रेज पर टाइमज़ोन के साथ टाइम कॉलम कैसे बनाएं?

  2. Cygnus-NGSI PostgreSQL में डेटा नहीं बचाएगा

  3. PgAdmin4 डिबगिंग सक्षम करें

  4. JDBC के माध्यम से PostgreSQL तालिका में daterange फ़ील्ड मान डालें

  5. सक्रिय रिकॉर्ड क्वेरी में समय आधारित प्राथमिकता