यह एक ज्ञात सीमा है:अगला ()
फ़ंक्शन, जो आपके क्षेत्र का आपका डिफ़ॉल्ट मान है। जब आप INSERT
. पर डेटा की आपूर्ति करते हैं उस फ़ील्ड के लिए, डिफ़ॉल्ट मान का व्यंजक मूल्यांकन नहीं करता है, इसलिए अनुक्रम का मान स्पर्श नहीं किया जाता है।
INSERT
. से पहले/बाद में ट्रिगर सेट करना एक वैकल्पिक हल है अनुक्रम के मान को मैन्युअल रूप से ठीक करने के लिए setval()
. लेकिन इस तरह आपको चाहिए अद्यतन
पर एक ट्रिगर सेट अप करने की आवश्यकता है उस फ़ील्ड पर भी, अनुक्रम के मान को ठीक करने के लिए, जब आप किसी मौजूदा आईडी को किसी उच्च आईडी में अपडेट करते हैं।
एक अन्य समाधान यह है कि आप एक संग्रहीत फ़ंक्शन लिखते हैं, जो उस फ़ील्ड के लिए उपलब्ध मान उत्पन्न कर सकता है और आपके फ़ील्ड का डिफ़ॉल्ट मान उस फ़ंक्शन के रिटर्न मान पर सेट कर सकता है। कुछ, जैसे:
LOOP
result = nextval('my_id_seq');
EXIT WHEN NOT EXISTS (SELECT * FROM my_table WHERE my_id = result);
END LOOP;
RETURN result;
लेकिन सावधान रहें:अनुक्रमों के लिए डिफ़ॉल्ट कार्यक्षमता समवर्ती आवेषण के लिए सुरक्षित है (अनुक्रम की वर्तमान स्थिति वैश्विक है - लेनदेन स्वतंत्र)। यदि आप उन क्षेत्रों को स्पष्ट मान प्रदान करते हैं, तो ऐसा नहीं होगा।