अनुक्रम से मान प्राप्त करने के लिए आप सीटीई का उपयोग कर सकते हैं एक बार और इसका उपयोग बार-बार करें :
WITH cte AS (
SELECT nextval('foo_id_seq') AS id
)
INSERT INTO foo (id, ltree)
SELECT id, '1.' || id
FROM cte;
डेटा-संशोधित कमांड वाले CTE को 9.1 या बाद के संस्करण की आवश्यकता होती है।
यदि आप अनुक्रम के नाम के बारे में सुनिश्चित नहीं हैं, तो pg_get_serial_sequence()
का उपयोग करें इसके बजाय:
WITH i AS (
SELECT nextval(pg_get_serial_sequence('foo', 'id')) AS id
)
INSERT INTO foo (id, ltree)
SELECT id, '1.' || id
FROM i;
यदि तालिका नाम "foo" डीबी में सभी स्कीमा में अद्वितीय नहीं हो सकता है, तो इसे स्कीमा-योग्यता प्राप्त करें। और अगर किसी नाम की स्पेलिंग गैर-मानक है, तो आपको दोहरा-उद्धरण करना होगा:
pg_get_serial_sequence('"My_odd_Schema".foo', 'id')
त्वरित परीक्षणों ने lastval()
. के साथ @Mark के विचार का संकेत दिया हो सकता है काम भी:
INSERT INTO foo (ltree) VALUES ('1.' || lastval());
-
आप बस
id
leave छोड़ सकते हैं क्वेरी से बाहर,serial
कॉलम स्वचालित रूप से असाइन किया जाएगा। कोई फर्क नहीं पड़ता। -
पंक्तियों के बीच दौड़ की स्थिति नहीं होनी चाहिए। मैं मैनुअल उद्धृत करता हूं:
currval
nextval
. द्वारा हाल ही में प्राप्त किया गया मान लौटाएं इस क्रम के लिए चालू सत्र में (एक त्रुटि की सूचना दी जाती है यदि nextval
इस सत्र में इस क्रम के लिए कभी भी बुलाया नहीं गया है।) चूंकि यह एक सत्र-स्थानीय मान लौटा रहा है, यह एक पूर्वानुमानित उत्तर देता है कि क्या अन्य सत्रों ने nextval
निष्पादित किया है या नहीं। वर्तमान सत्र के बाद से.
इस फ़ंक्शन के लिए USAGE
की आवश्यकता है या SELECT
अनुक्रम पर विशेषाधिकार।
lastval
nextval
. द्वारा हाल ही में लौटाया गया मान लौटाएं वर्तमान सत्र में। यह फ़ंक्शन currval
के समान है , को छोड़कर अनुक्रम नाम को तर्क के रूप में लेने के बजाय यह जो भी nextval
. को संदर्भित करता है सबसे हाल ही में वर्तमान सत्र में लागू किया गया था। lastval
. को कॉल करना एक त्रुटि है अगर nextval
वर्तमान सत्र में अभी तक नहीं बुलाया गया है।
इस फ़ंक्शन के लिए USAGE
की आवश्यकता है या SELECT
अंतिम उपयोग किए गए अनुक्रम पर विशेषाधिकार।
बोल्ड जोर मेरा।
लेकिन , जैसा कि @ बर्नार्ड ने टिप्पणी की, यह आखिरकार विफल हो सकता है:इस बात की कोई गारंटी नहीं है कि डिफ़ॉल्ट मान भरा हुआ है (और nextval()
प्रक्रिया में बुलाया गया) पहले lastval()
दूसरे कॉलम को भरने के लिए कहा जाता है ltree
. तो पहले समाधान के साथ रहें और nextval()
सुनिश्चित करने के लिए।