2012-02-02 14 views
31

मैं postgres में निम्न तालिका है:postgres autoincrement स्पष्ट आईडी पर अद्यतन नहीं सम्मिलित करता

CREATE TABLE "test" (
    "id" serial NOT NULL PRIMARY KEY, 
    "value" text 
) 

मैं निम्नलिखित सम्मिलन कर रहा हूँ:

insert into test (id, value) values (1, 'alpha') 
insert into test (id, value) values (2, 'beta') 

insert into test (value) values ('gamma') 

पहले 2 आवेषण में मैं स्पष्ट रूप से आईडी का उल्लेख कर रहा हूँ । हालांकि इस मामले में तालिका का ऑटो वृद्धि सूचक अपडेट नहीं किया गया है।

ERROR: duplicate key value violates unique constraint "test_pkey" 
DETAIL: Key (id)=(1) already exists. 

मैं दोनों MyISAM और InnoDB इंजन में MySQL में इस समस्या का सामना करना पड़ा कभी नहीं: इसलिए 3 डालने में मैं त्रुटि मिलती है। स्पष्ट या नहीं, mysql हमेशा अधिकतम पंक्ति आईडी के आधार पर ऑटोइनक्रिकमेंट पॉइंटर अपडेट करता है।

पोस्टग्रेज़ में इस समस्या के लिए समाधान क्या है? मुझे इसकी ज़रूरत है क्योंकि मैं अपनी मेज में कुछ आईडी के लिए कड़ा नियंत्रण चाहता हूं।

अद्यतन: मुझे इसकी आवश्यकता है क्योंकि कुछ मूल्यों के लिए मुझे एक निश्चित आईडी की आवश्यकता है। अन्य नई प्रविष्टियों के लिए मुझे नए बनाने में कोई फर्क नहीं पड़ता।

मुझे लगता है कि जब भी मैं स्पष्ट रूप से आईडी को सम्मिलित कर रहा हूं तो nextval पॉइंटर max(id) + 1 पर मैन्युअल रूप से बढ़ाना संभव हो सकता है। लेकिन मुझे यकीन नहीं है कि यह कैसे करें।

उत्तर

53

इस तरह यह काम करना चाहिए - next_val('test_id_seq') केवल तभी कॉल किया जाता है जब सिस्टम को इस कॉलम के लिए मूल्य की आवश्यकता होती है और आपने एक प्रदान नहीं किया है। यदि आप मूल्य प्रदान करते हैं तो ऐसा कोई कॉल नहीं किया जाता है और इसके परिणामस्वरूप अनुक्रम "अद्यतन" नहीं होता है।

आप इस के आसपास मैन्युअल setting द्वारा स्पष्ट रूप से प्रदान की जाती मूल्यों के साथ अपने पिछले डालने के बाद अनुक्रम का मूल्य काम कर सकता था:

SELECT setval('test_id_seq', (SELECT MAX(id) from "test")); 
+1

@ Milen एक Radev +1, धन्यवाद है कि यह किया! – jerrymouse

+1

अजीब व्यवहार। मैं भी MySQL से आ रहा हूँ। धन्यवाद! –

+0

मैं एक ही समस्या में और आपके बीच और http://www.ruby-forum.com/topic/64428#72333 (आप मूल रूप से वही बात कहते हैं) में भाग गए हैं, आपने मेरी समस्या का समाधान किया है। धन्यवाद। – marsol0x

संबंधित मुद्दे