केवल DEFERRABLE
बाधाओं को टाला जा सकता है।
मुझे पहले बेहतर विकल्प सुझाएं:
<एच4>1.INSERT
क्रम में
INSERT
के अनुक्रम को उल्टा करें बयान और कुछ भी स्थगित करने की आवश्यकता नहीं है। सबसे सरल और तेज़ - यदि संभव हो तो।
इसे एकल आदेश में करें . फिर भी कुछ भी स्थगित करने की आवश्यकता नहीं है, क्योंकि गैर-आस्थगित बाधाओं की जाँच की जाती है प्रत्येक आदेश के बाद और 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 बताया
।