2008-09-29 14 views
11

एसक्यूएल में, तालिका को अपडेट कैसे करें, प्रत्येक पंक्ति के लिए कॉलम को एक अलग मान पर सेट करें?PostgreSQL अनुक्रम का उपयोग कर SQL में अद्वितीय मानों को कैसे अपडेट करें?

मैं एक पोस्टग्रेएसक्यूएल डेटाबेस में कुछ पंक्तियों को अपडेट करना चाहता हूं, एक कॉलम को अनुक्रम से किसी संख्या में सेट करना चाहता हूं, जहां उस कॉलम में एक अद्वितीय बाधा है। मुझे आशा थी कि मैं सिर्फ इस्तेमाल कर सकते हैं:

update person set unique_number = (select nextval('number_sequence')); 

लेकिन ऐसा लगता है कि nextval केवल एक बार कहा जाता है, तो अद्यतन हर पंक्ति के लिए एक ही नंबर का उपयोग करता है, और मैं एक 'नकली चाबी अद्वितीय बाधा का उल्लंघन करती है' प्राप्त होने वाले त्रुटि । इसके बजाय मुझे क्या करना चाहिए?

उत्तर

28

एक subselect का उपयोग न करें, बल्कि इस तरह, सीधे nextval समारोह का उपयोग करें:

update person set unique_number = nextval('number_sequence'); 
+0

धन्यवाद - यह काम करता है। मैं उप-चयन द्वारा पकड़ा गया क्योंकि मैं दो स्तंभों के लिए समान अनुक्रम संख्या का उपयोग करने की कोशिश कर रहा था, लेकिन मुझे वास्तव में ऐसा करने की आवश्यकता नहीं है। –

+0

यदि आप अगलीवाल ('अनुक्रम') कहने के बाद समान अनुक्रम मान का पुन: उपयोग करना चाहते हैं, तो आप संबंधित फ़ंक्शन currval ('अनुक्रम') का उपयोग कर सकते हैं, जो वर्तमान अनुक्रम देता है। – cms

0

मैं स्नातकोत्तर के दृश्यों एक हैक और संकेत है कि वृद्धिशील पूर्णांकों कुंजी पंक्तियों का सबसे अच्छा तरीका नहीं हैं पर विचार करें। हालांकि pgsql जब तक 8,3

http://www.postgresql.org/docs/8.3/interactive/datatype-uuid.html

UUIDs के लिए देशी समर्थन नहीं मिला UUID के लाभ है कि संयोजन लगभग अनंत हैं, एक यादृच्छिक संख्या जो एक टक्कर एक दिन मारा जाएगा के विपरीत है।

+0

"लगभग अनंत?" दस्तावेज़ कहते हैं कि यह एक 128-बिट पूर्णांक प्रकार है। यह बहुत कुछ है, लेकिन यह अनंत नहीं है, और सभी 2^128 मानों का उपयोग करने से पहले टक्कर मारना लगभग निश्चित है। इसके अतिरिक्त, ओआरएम को इसका उपयोग करने के लिए स्ट्रिंग प्रकारों में/से कनवर्ट करना होगा। मेरे विचार में स्पष्ट जीत नहीं है। – wberry

+2

मुझे लगता है कि आप अनुमान लगाते हैं कि 2^128 कितना बड़ा है, विकिपीडिया पर यूयूआईडी के बारे में पढ़ें। – TravisO

+0

यह ज्यादातर अकादमिक है, लेकिन एक पोस्टग्रेस अनुक्रम यूयूआईडी की तुलना में अधिक टक्कर-सबूत हो सकता है कि यह कैसे बनाया जाता है। पायथन का 'यूयूआईडी' मॉड्यूल एक यादृच्छिक घटक का उपयोग करता है, लेकिन 128 यादृच्छिक बिट्स से काफी कम है। अनुक्रम केवल तभी टक्कर मारते हैं जब वे चक्र, यादृच्छिक संख्या टकराते हैं ... यादृच्छिक रूप से। – wberry

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