मैन्युअल रूप से अनुक्रम को बदल देता है


189

मैं एक विशिष्ट मूल्य के लिए एक क्रम निर्धारित करने की कोशिश कर रहा हूँ।

SELECT setval('payments_id_seq'), 21, true

यह एक त्रुटि देता है:

ERROR: function setval(unknown) does not exist

का उपयोग करना ALTER SEQUENCEया तो काम नहीं लगता है?

ALTER SEQUENCE payments_id_seq LASTVALUE 22

यह कैसे किया जा सकता है?

Ref: https://www.postgresql.org/docs/current/static/functions-fterence.html


4
ऐसा प्रतीत होता है कि setval()कम से कम दो तर्क हैं।

जवाबों:


259

कोष्ठक गलत हैं:

SELECT setval('payments_id_seq', 21, true);  # next value will be 22

अन्यथा आप setvalएकल तर्क के साथ कॉल कर रहे हैं , जबकि इसके लिए दो या तीन की आवश्यकता होती है।


2
अंतिम तर्क "सत्य" का क्या अर्थ है?
इनाफलाको

15
trueइसका मतलब है कि अगला मान इस मामले में + 1 प्रदान की गई संख्या होगा। 22। falseइसका मतलब है कि अगला मूल्य प्रदान की गई संख्या होगी, या 21. डिफ़ॉल्ट रूप से, सेटलवे व्यवहार करेंगे जैसे trueकि चुना गया था। अधिक जानकारी: postgresql.org/docs/9.6/static/functions-fterence.html
टॉम मेर्टज़

1
select setvalसिंटेक्स ओवर alter sequenceका एक फायदा यह है कि आप इसमें नेस्टेड क्वेरी का उपयोग कर सकते हैं, उदाहरण के लिए select max(id) from payments
मारीतोमो

182

यह सिंटैक्स PostgreSQL के किसी भी संस्करण में मान्य नहीं है :

ALTER SEQUENCE payments_id_seq LASTVALUE 22

यह काम करेगा:

ALTER SEQUENCE payments_id_seq RESTART WITH 22;

और इसके बराबर है:

SELECT setval('payments_id_seq', 22, FALSE);

वर्तमानALTER SEQUENCE और अनुक्रम कार्यों के लिए वर्तमान मैनुअल में अधिक ।

ध्यान दें कि या setval()तो उम्मीद है । उपरोक्त उदाहरण में मैं बिना पढ़े लिखे को प्रदान कर रहा हूँ । वह भी काम करता है। लेकिन अगर आप फ़ंक्शन को टाइप किए गए चर खिलाते हैं , तो फ़ंक्शन प्रकार के समाधान को पूरा करने के लिए आपको स्पष्ट प्रकार की जातियों की आवश्यकता हो सकती है । पसंद:(regclass, bigint)(regclass, bigint, boolean)

SELECT setval(my_text_variable::regclass, my_other_variable::bigint, FALSE);

बार-बार संचालन के लिए आप में रुचि हो सकती है:

ALTER SEQUENCE payments_id_seq START WITH 22; -- set default
ALTER SEQUENCE payments_id_seq RESTART;       -- without value

START [WITH]एक डिफ़ॉल्ट RESTARTसंख्या को संग्रहीत करता है , जिसका उपयोग बाद में RESTARTबिना मूल्य के कॉल के लिए किया जाता है । आपको पिछले भाग के लिए Postgres 8.4 या बाद की आवश्यकता है।


4
ALTER SEQUENCE [sequence] RESTART WITH (SELECT MAX(col) from table);काम नहीं करता है, जबकि काम नहीं SELECT setval('sequence', (SELECT (MAX(col) from table), TRUE);करता है। मुझे एक सिंटैक्स त्रुटि मिलती है। (पोस्टग्रैड्स 9.4)
न्यूक्लियरपोन

1
डीडीएल कमांड ("यूटिलिटी कमांड") में कोई उपश्रेणी की अनुमति नहीं है। देखें: stackoverflow.com/a/36025963/939860
इरविन ब्रान्डस्टेट्टर

1
@ मैटलप्रीतिमनी: आपको टाइप कास्ट्स की आवश्यकता हो सकती है। ऊपर दिए गए निर्देशों पर विचार करें।
एरविन ब्रान्डस्टेट्टर

1
@ NuclearPeon मुझे लगता है कि आप का मतलब है SELECT setval('sequence', (SELECT MAX(col) from table), TRUE);अन्यथा आपके पैरेंस लाइन अप नहीं करते हैं।
dland

1
@ डॉल: एक तरफ: छोटा और तेज़ समतुल्य: SELECT setval('seq', max(col)) FROM tbl;देखें: stackoverflow.com/a/23390399/939860
इरविन ब्रान्डेसटेटर

33

उपयोग select setval('payments_id_seq', 21, true);

setval 3 पैरामीटर हैं:

  • 1 पैरामीटर है sequence_name
  • दूसरा पैरामीटर अगला है nextval
  • तीसरा पैरामीटर वैकल्पिक है।

सेवल के तीसरे पैरामीटर में सही या गलत का उपयोग इस प्रकार है:

SELECT setval('payments_id_seq', 21);           // Next nextval will return 22
SELECT setval('payments_id_seq', 21, true);     // Same as above 
SELECT setval('payments_id_seq', 21, false);    // Next nextval will return 21

अनुक्रम नाम, अगले अनुक्रम मान की हार्ड-कोडिंग से बचने और खाली कॉलम तालिका को सही ढंग से संभालने का बेहतर तरीका है, आप नीचे दिए गए तरीके का उपयोग कर सकते हैं:

SELECT setval(pg_get_serial_sequence('table_name', 'id'), coalesce(max(id), 0)+1 , false) FROM table_name;

जहां table_nameतालिका का नाम है, idहै primary keyतालिका के


धन्यवाद! अंतिम अभिव्यक्ति वास्तव में वही है जिसकी मुझे तलाश थी। यह मुझे बैच द्वारा बाद में डालने के लिए अनुक्रम मानों को आरक्षित करने की अनुमति देता है।
तैमूर


0

मैं के माध्यम से अनुक्रम बदलने की कोशिश नहीं करते setval। लेकिन ALTERमैं का उपयोग करके जारी किया गया था कि अनुक्रम नाम को ठीक से कैसे लिखा जाए। और यह केवल मेरे लिए काम करता है:

  1. आवश्यक अनुक्रम नाम की जाँच करें SELECT * FROM information_schema.sequences;

  2. ALTER SEQUENCE public."table_name_Id_seq" restart {number};

    मेरे मामले में यह था ALTER SEQUENCE public."Services_Id_seq" restart 8;

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.