पोस्टग्रेज में ऑटो इंक्रीमेंट काउंटर रीसेट करें


232

मैं कुछ मूल्य के लिए एक तालिका के ऑटो वेतन वृद्धि क्षेत्र को मजबूर करना चाहूंगा, मैंने इसके साथ प्रयास किया:

ALTER TABLE product AUTO_INCREMENT = 1453

तथा

ALTER SEQUENCE product  RESTART WITH 1453;
ERROR:  relation "your_sequence_name" does not exist

मैं पोस्टग्रेट्स के लिए नया हूं :(

मेरे पास एक टेबल productहै Idऔर nameफील्ड है


5
यदि नया क्यों pgAdmin का उपयोग नहीं करता है और यह उत्पन्न होने वाली कमांड का निरीक्षण करेगा?
अनरसन

1
आमतौर पर तालिकाओं को 'उत्पादों' की तरह नाम दिया जाता है और "उत्पाद" की तरह नहीं। इस मामले में आपके अनुक्रम का नाम "उत्पादों_से_सेक" रखा जाएगा। सुनिश्चित करें कि आप एक सही अनुक्रम की तलाश कर रहे हैं।
अलेक्जेंडर गोर्ग

जवाबों:


309

यदि आपने productएक idस्तंभ के साथ तालिका बनाई है , तो अनुक्रम बस नहीं कहा जाता है product, बल्कि product_id_seq(यह है ${table}_${column}_seq)।

यह वह ALTER SEQUENCEकमांड है जिसकी आपको आवश्यकता है:

ALTER SEQUENCE product_id_seq RESTART WITH 1453

आप \dspsql में कमांड का उपयोग करके अपने डेटाबेस में अनुक्रम देख सकते हैं । यदि आप करते हैं \d productऔर अपने कॉलम के लिए डिफ़ॉल्ट बाधा देखते हैं, तो nextval(...)कॉल अनुक्रम नाम भी निर्दिष्ट करेगा।


66
यह इस संदेश से स्पष्ट नहीं है कि सही सिंटैक्स क्या है। यह है: १४५३ के साथ पहले से उत्पाद_पर_सेठ पुनर्स्थापना;
लिरोन याहदव

7
सिर्फ इसलिए कि मैंने ऊपर वाले को बेचारा समझा, यहाँ ठीक उसी चीज को बहाल करने का मेरा तरीका है। वाक्यविन्यास है ALTER SEQUENCE yourTableName_yourColumnName_seq RESTART WITH #, जहां "seq" शाब्दिक पाठ है, और आप # के लिए एक संख्या में डालते हैं। अंडरस्कोर की उपेक्षा न करें। :-)
किमीॉर्ट

2
कृपया ध्यान दें कि यदि सार्वजनिक स्कीमा का उपयोग नहीं किया जा रहा है तो इसे my_schema के साथ उपसर्ग करने की आवश्यकता है। ALTER SEQUENCE my_schema.product_id_seq RESTART WITH 1453
डैनियल एल वानडेनबोश

क्या किसी को पता है कि उत्पाद के कारण (सेलेक्ट मैक्स (आईडी)) के साथ उत्पाद के बारे में पता कैसे चल सकता है; काम नहीं करता है? मेरा एकमात्र तरीका दो अलग-अलग प्रश्नों का उपयोग करना है।
क्रिस हुआंग-लीवर

8
ध्यान दें कि जिस मूल्य के साथ आप पुनः आरंभ करते हैं वह अगला मूल्य है जिसका आप उपयोग करना चाहते हैं। इसलिए यदि आपके पास पहले से ही आईडी है 1453, तो आपको चाहिए RESTART WITH 1454
ह्यूजेस

144

यहां वह कमांड है जिसे आप देख रहे हैं, उत्पाद तालिका के लिए अपना क्रम मान रहे हैं product_id_seq:

1453 के साथ उत्पाद की सूची_सेकस रेस्टार्ट;


130

निम्न आदेश आपके लिए यह स्वचालित रूप से करता है: यह तालिका के सभी डेटा को भी हटा देगा। तो सावधान रहें।

TRUNCATE TABLE someTable RESTART IDENTITY;

21
खबरदार - यह आपके सभी डेटा को डिलीट कर देगा
kibibu

28
@ लूलूई, इसे झंडी दिखाते हुए; यदि कोई SQL से अपरिचित है, तो यहां खोज कर रहा है, क्योंकि उन्होंने मैन्युअल रूप से एक पंक्ति को एक ऑटोइनक्रिमेंट फ़ील्ड (ORM के माध्यम से उदाहरण के लिए) में जोड़ा है, तो यह समाधान संभवतः वह नहीं है जिसकी वे अपेक्षा करते हैं।
किबिबू

1
TABLEकीवर्ड अनावश्यक है। TRUNCATE someTable RESTART IDENTITY;पर्याप्त है।
user1

किसी भी विचार कैसे मैं CASCADE के साथ ऐसा करेंगे?
इहोसैन

2
@ जिस्मानी आपने कोशिश की है TRUNCATE someTable RESTART IDENTITY CASCADE;?
वेदरन

55

अनुक्रम काउंटर सेट करने के लिए:

setval('product_id_seq', 1453);

यदि आपको अनुक्रम नाम का पता नहीं है, तो pg_get_serial_sequenceफ़ंक्शन का उपयोग करें :

select pg_get_serial_sequence('product', 'id');
 pg_get_serial_sequence 
------------------------
 public.product_id_seq

पैरामीटर तालिका का नाम और स्तंभ नाम हैं।

या प्रॉम्प्ट \d productपर बस जारी करें psql:

=> \d product
                         Table "public.product"
 Column |  Type   |                      Modifiers                       
--------+---------+------------------------------------------------------
 id     | integer | not null default nextval('product_id_seq'::regclass)
 name   | text    | 

14

- अनुक्रम के शुरुआती मूल्य को बदलें

ALTER SEQUENCE project_id_seq RESTART 3000;

समान लेकिन गतिशील:

SELECT SETVAL('project_id_seq', (SELECT MAX(id) + 1 FROM project));

मैं मानता हूं कि एक SELECT का उपयोग परेशान कर रहा है लेकिन यह काम करता है।

स्रोत: https://kylewbanks.com/blog/Adding-or-Modifying-a-PostgreSQL-Sequence-Auto-Increment


अगर मैं गलत नहीं हूं, तो पीजी last_value और is_called के साथ उनके दृश्यों का प्रतिनिधित्व करता है, (1, गलत), तब शुरू होता है, (1, सच), (2, सच) ... तो MAX (आईडी) + 1 अधिकतम होना चाहिए (आईडी) एक आईडी को छोड़ नहीं करने के बजाय।
दस

मुझे काम करने के लिए अपने पोस्टग्रेज उदाहरण को फिर से शुरू करना पड़ा। brew services restart postgresql
BigRon

SELECT SETVAL ('project_id_seq', (Select MAX (id) + 1 FROM Project)); पूरी तरह से काम करता है लेकिन क्या वेतन वृद्धि मूल्य को 0. पर रीसेट करने का एक तरीका है? इसलिए नई प्रविष्टियां 0 इंडेक्स से शुरू होती हैं?
चरिथ जयसंका

13

आगंतुक की सुविधा के लिए टिप्पणी से परिवर्तित

यह इस संदेश से स्पष्ट नहीं है कि सही सिंटैक्स क्या है। यह है:

ALTER SEQUENCE product_id_seq RESTART WITH 1453;

6

यदि आप GUI से ऑटो वेतन वृद्धि को रीसेट करना चाहते हैं , तो इस चरणों का पालन करें।

  1. अपने डेटाबेस पर जाएँ
  2. जनता पर क्लिक करें
  3. तालिकाओं की सूची पृष्ठ में आप TABS को 'टेबल्स', 'दृश्य', 'अनुक्रम' जैसे देख सकते हैं ।
  4. पर क्लिक करें अनुक्रम
  5. जब आप 'अनुक्रम' पर क्लिक करते हैं तो आप सभी अनुक्रम सूची देख सकते हैं, किसी भी उस पर क्लिक करें जिसे आप चाहते हैं रीसेट
  6. उसके बाद आप 'अल्टर', 'सेट वैल्यू', 'रिस्टार्ट', 'रीसेट' आदि जैसी कई पसंद देख सकते हैं ...
  7. फिर रीसेट पर क्लिक करें , फिर एक नई पंक्ति जोड़ें।

6

यदि आपके पास एक पहचान स्तंभ के साथ एक तालिका है जिसे आप अगले मूल्य को रीसेट करना चाहते हैं तो आप निम्न कमांड का उपयोग कर सकते हैं:

ALTER TABLE <table name> 
    ALTER COLUMN <column name> 
        RESTART WITH <new value to restart with>;

1
वहाँ कोई नहीं है sequenceया आप तालिका काट नहीं सकते हैं के मामले में प्रयोज्य के लिए एक + । मुझे लगता है कि इसका सबसे अच्छा जवाब है
ABS

5

निम्नलिखित क्वेरी का उपयोग करके आपको ऑटो इंक्रीमेंट को रीसेट करना होगा।

वाक्य - विन्यास:

SELECT pg_get_serial_sequence(‘tablename’,  columnname‘);

उदाहरण:

SELECT pg_get_serial_sequence('demo', 'autoid');

क्वेरी ऑटोड के अनुक्रम नाम को "Demo_autoid_seq" के रूप में लौटाएगी फिर को रीसेट करने के लिए निम्न क्वेरी का उपयोग करें

वाक्य - विन्यास:

ALTER SEQUENCE sequenceName RESTART WITH value;

उदाहरण:

ALTER SEQUENCE "Demo_autoid_seq" RESTART WITH 1453;

3

अनुक्रम आईडी का उपयोग करने के लिए

SELECT pg_get_serial_sequence('tableName', 'ColumnName');

हो जाएगा ताकि आप के रूप में sequesce आईडी देता tableName_ColumnName_seq

अंतिम बीज संख्या का उपयोग करने के लिए

select currval(pg_get_serial_sequence('tableName', 'ColumnName'));

या यदि आप जानते हैं कि अनुक्रम आईडी पहले से ही इसे सीधे उपयोग करें।

select currval(tableName_ColumnName_seq);

यह आपको अंतिम बीज संख्या देगा

बीज संख्या का उपयोग रीसेट करने के लिए

ALTER SEQUENCE tableName_ColumnName_seq RESTART WITH 45

1

स्कीमा और टेबल के साथ अनुक्रम कुंजी क्या है, यह जांचने के लिए इस क्वेरी का उपयोग करें ,

SELECT pg_get_serial_sequence('"SchemaName"."TableName"', 'KeyColumnName'); // output: "SequenceKey"

एक-एक करके इस वृद्धि मूल्य वृद्धि का उपयोग करें,

SELECT nextval('"SchemaName"."SequenceKey"'::regclass); // output 110

जब अगले बढ़े हुए मूल्य को तालिका में सम्मिलित किया जाता है तो इसे कुंजी (111) के रूप में उपयोग किया जाएगा।

बढ़े हुए मूल्य के रूप में विशिष्ट मूल्य निर्धारित करने के लिए इस क्वेरी का उपयोग करें

SELECT setval('"SchemaName"."SequenceKey"', 120);

जब अगले वेतन वृद्धि की मेज पर डालने के लिए कुंजी (121) के रूप में उपयोग किया जाएगा।


0

ध्यान दें कि यदि आपके पास '_' के साथ टेबल का नाम है, तो इसे अनुक्रम नाम से हटा दिया जाता है।

उदाहरण के लिए, तालिका का नाम: user_tokens कॉलम: id अनुक्रम नाम: usertokens_id_seq

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