PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

उसी INSERT के दौरान दूसरे कॉलम में सीरियल कॉलम का संदर्भ मान

अनुक्रम से मान प्राप्त करने के लिए आप सीटीई का उपयोग कर सकते हैं एक बार और इसका उपयोग बार-बार करें :

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() सुनिश्चित करने के लिए।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. एकाधिक पंक्तियों को अद्यतन करते समय नल प्रकार कास्टिंग

  2. pg_restore विकल्प - PostgreSQL बैकअप और ClusterControl के साथ स्वचालित पुनर्प्राप्ति

  3. कैसे PostgreSQL तालिका के लिए पांडा DataFrame upsert करने के लिए?

  4. SQL क्वेरी स्तंभ मौजूद नहीं है त्रुटि

  5. PostgreSQL डेटाबेस बनाएँ