@Craig ने क्या प्रदान किया (और इसमें से कुछ को सही करने के अलावा):
प्रभावी Postgres 9.4 , UNIQUE, PRIMARY KEYऔर EXCLUDEबाधाओं तुरंत जाँच कर रहे हैं प्रत्येक पंक्ति के बाद जब परिभाषित NOT DEFERRABLE। यह अन्य प्रकार की NOT DEFERRABLEबाधाओं (वर्तमान में केवल REFERENCES(विदेशी कुंजी)) से भिन्न है, जो प्रत्येक कथन के बाद जाँची जाती हैं । एसओ पर इस संबंधित प्रश्न के तहत हमने यह सब काम किया:
यह एक (या या ) बाधा के लिए पर्याप्त नहीं है कि आप अपने स्टेटमेंट को कई स्टेटमेंट वर्क के साथ बना सकें।UNIQUEPRIMARY KEYEXCLUDEDEFERRABLE
और आप इस उद्देश्य के लिए उपयोग नहीं कर सकते ALTER TABLE ... ALTER CONSTRAINT। प्रति प्रलेखन:
ALTER CONSTRAINT
यह प्रपत्र पहले बनाई गई बाधा की विशेषताओं को बदल देता है। वर्तमान में केवल विदेशी प्रमुख बाधाओं को बदला जा सकता है ।
बोल्ड जोर मेरा। इसके बजाय उपयोग करें:
ALTER TABLE t
DROP CONSTRAINT category_name_key
, ADD CONSTRAINT category_name_key UNIQUE(name) DEFERRABLE;
एक ही कथन में बाधा को वापस छोड़ें और जोड़ दें ताकि किसी को भी आपत्तिजनक पंक्तियों में घुसने में कोई समय न हो। बड़ी तालिकाओं के लिए यह अंतर्निहित अद्वितीय सूचकांक को किसी भी तरह से संरक्षित करने के लिए लुभाना होगा, क्योंकि इसे हटाना और फिर से बनाना महंगा है। काश, यह मानक उपकरणों के साथ संभव नहीं लगता (यदि आपके पास इसका कोई समाधान है, तो कृपया हमें बताएं!):
एक के लिए एक बयान बाधा deferrable बनाने के लिए पर्याप्त है:
UPDATE category c
SET name = c_old.name
FROM category c_old
WHERE c.id IN (1,2)
AND c_old.id IN (1,2)
AND c.id <> c_old.id;
CTE के साथ एक प्रश्न भी एक ही कथन है:
WITH x AS (
UPDATE category SET name = 'phones' WHERE id = 1
)
UPDATE category SET name = 'tablets' WHERE id = 2;
हालाँकि , कई बयानों के साथ आपके कोड के लिए आपको (अतिरिक्त) वास्तव में बाधा को दूर करने की आवश्यकता है - या इसे परिभाषित करें क्योंकि INITIALLY DEFERREDया तो आमतौर पर ऊपर की तुलना में अधिक महंगा है। लेकिन यह आसानी से एक बयान में सब कुछ पैक करने के लिए संभव नहीं है।
BEGIN;
SET CONSTRAINTS category_name_key DEFERRED;
UPDATE category SET name = 'phones' WHERE id = 1;
UPDATE category SET name = 'tablets' WHERE id = 2;
COMMIT;
हालांकि, बाधाओं के संबंध में एक सीमा से अवगत रहें FOREIGN KEY। प्रति प्रलेखन:
संदर्भित तालिका संदर्भित तालिका में एक गैर-विलक्षण अद्वितीय या प्राथमिक कुंजी बाधा के कॉलम होने चाहिए ।
तो आप दोनों एक ही समय में नहीं हो सकते।