यद्यपि इस प्रश्न के वर्ष बीत चुके हैं, मैं स्पैनिश वक्ताओं के लिए स्पष्ट करना चाहूंगा, परीक्षण पोस्टग्रैज में किए गए हैं:
निम्नलिखित बाधा को 1337 रिकॉर्ड की तालिका में जोड़ा गया था, जहां किट प्राथमिक कुंजी है:
**Bloque 1**
ALTER TABLE ele_kitscompletos
ADD CONSTRAINT unique_div_nkit
PRIMARY KEY (div_nkit)
यह तालिका के लिए डिफ़ॉल्ट प्राथमिक कुंजी नहीं बनाई जाती है ताकि अगले अद्यतन की कोशिश करते समय हमें त्रुटि मिले:
update ele_kitscompletos
set div_nkit = div_nkit + 1;
त्रुटि: नकली कुंजी विशिष्टता प्रतिबंध का उल्लंघन करती है «unique_div_nkit»
Postgres में, प्रत्येक ROW के लिए एक UPDATE को निष्पादित करना सत्यापित करता है कि RESTRICTION या CONSTRAINT मिले हैं।
CONSTRAINT IMMEDIATE अब बनाया गया है और प्रत्येक विवरण को अलग से निष्पादित किया गया है:
ALTER TABLE ele_kitscompletos
ADD CONSTRAINT unique_div_nkit
PRIMARY KEY (div_nkit)
DEFERRABLE INITIALLY IMMEDIATE
**Bloque 2**
BEGIN;
UPDATE ele_kitscompletos set div_nkit = div_nkit + 1;
INSERT INTO public.ele_kitscompletos(div_nkit, otro_campo)
VALUES
(1338, '888150502');
COMMIT;
क्वेरी ठीक, 0 पंक्तियाँ प्रभावित (निष्पादन समय: 0 एमएस; कुल समय: 0 एमएस) क्वेरी ठीक, 1328 पंक्तियाँ प्रभावित (निष्पादन समय: 858 एमएस; कुल समय: 858 एमएस) त्रुटि: विलो डुप्लिकेट वियाला restriccios de unicidad «unique_div_nkit» DETAIL : हां अस्तित्व ला लेल्वे (div_nkit) = (1338)।
यहां SI प्राथमिक कुंजी को बदलने की अनुमति देता है क्योंकि यह पूरे पहले पूर्ण वाक्य (1328 पंक्तियों) को निष्पादित करता है; लेकिन यद्यपि यह लेन-देन (BEGIN) में है, CONSTRAINT को COMMIT किए बिना प्रत्येक वाक्य को पूरा करने पर तुरंत मान्य किया जाता है, इसलिए INSERT निष्पादित करते समय त्रुटि उत्पन्न करता है। अंत में हमने CONSTRAINT DEFERRED को निम्न बनाया:
**Bloque 3**
ALTER TABLE public.ele_edivipol
DROP CONSTRAINT unique_div_nkit RESTRICT;
ALTER TABLE ele_edivipol
ADD CONSTRAINT unique_div_nkit
PRIMARY KEY (div_nkit)
DEFERRABLE INITIALLY DEFERRED
यदि हम ** ब्लॉक 2 ** के प्रत्येक कथन को अलग-अलग निष्पादित करते हैं, तो INSERT में कोई भी त्रुटि उत्पन्न नहीं होती है क्योंकि यह मान्य नहीं होता है लेकिन अंतिम COMMIT को निष्पादित किया जाता है जहां यह एक असंगति पाता है।
अंग्रेजी में पूरी जानकारी के लिए मेरा सुझाव है कि आप लिंक की जाँच करें:
डेफ़्रेबल एसक्यूएल बाधाओं को गहराई में
निश्चित रूप से निष्क्रिय बनाम निष्क्रिय नहीं