2012-02-26 13 views
24

मैं तालिका पर अनुक्रम कैसे बना सकता हूं ताकि यह 0 -> अधिकतम मान से हो? मैं निम्नलिखित एसक्यूएल कोड का उपयोग कर की कोशिश की है, लेकिन यह है कि मैं का उपयोग कर रहा तालिका में कोई भी मान सम्मिलित नहीं करता है:किसी मौजूदा तालिका पर अनुक्रम बनाना

CREATE SEQUENCE rid_seq; 
ALTER TABLE test ADD COLUMN rid INTEGER; 
ALTER TABLE test ALTER COLUMN rid SET DEFAULT nextval('rid_seq'); 

तालिका मैं में अनुक्रम सम्मिलित करने के लिए कोशिश कर रहा हूँ अन्य क्वेरी से उत्पादन होता है। मैं यह नहीं समझ सकता कि क्या यह प्रारंभिक क्वेरी के दौरान अनुक्रम जोड़ने के लिए और क्वेरी के बाद तालिका में अनुक्रम जोड़ने के लिए अधिक समझ में आता है।

उत्तर

-3

मैं पोस्टग्रेस्क्ल में धाराप्रवाह नहीं हूं इसलिए मैं "सीक्वेट बनाएं" कथन से परिचित नहीं हूं। हालांकि, मुझे लगता है कि आप कॉलम परिभाषा को सही तरीके से जोड़ रहे हैं। हालांकि, कॉलम जोड़ना मौजूदा पंक्तियों के लिए स्वचालित रूप से डेटा सम्मिलित नहीं करता है। एक नई बाधा के लिए एक निश्चित बाधा है। मौजूदा पंक्तियों पर डेटा को पॉप्युलेट करने के लिए बाद में कुछ ऐसा जोड़ने का प्रयास करें।

DECLARE @i Int 
SET @i = 0 
SET ROWCOUNT 1 
WHILE EXISTS (SELECT 1 FROM test WHERE rid IS NULL) BEGIN 
    UPDATE test SET rid = @i WHERE rid IS NULL 
END 
SET ROWCOUNT 0 
+0

स्निपेट के लिए धन्यवाद। जब मैं इसे चलाने का प्रयास करता हूं तो मैं सिंटैक्स त्रुटियों में भाग रहा हूं: '' या उसके पास @ '। मैं Postgreqsl में चर परिभाषा से परिचित नहीं हूं इसलिए मुझे यकीन नहीं है कि क्या कुछ स्पष्ट है जिसे मुझे बदलने की जरूरत है। – djq

+0

(1) यह SQL सर्वर या संभवतः MySQL वाक्यविन्यास जैसा दिखता है, यह PostgreSQL में काम नहीं करेगा। (2) जैसे ही नई पंक्तियां जोड़ दी जाती हैं, वैसे ही इससे कुछ परेशानी होती है क्योंकि आप अनुक्रम से मूल्यों का उपयोग नहीं कर रहे हैं, अनुक्रम से बाहर आने वाला अगला मान 1 होगा, भले ही आपने पहले से ही ' rid'। –

+0

अच्छा पकड़, [एमयू बहुत छोटा है] (http://stackoverflow.com/users/479863/mu-is-too-short), अनुक्रम मानों का उपयोग न करने के बारे में। और हाँ, मैं एमएस एसक्यूएल सर्वर कोड लिखने में बहुत अच्छा हूं (जिसके साथ मैंने इसे थोड़ा अलग तरीके से निपटाया होगा) और पोस्टग्रेएसक्यूएल से बिल्कुल परिचित नहीं हूं।जिस बिंदु को मैं करने का प्रयास कर रहा था वह एक बाधा को परिभाषित करने और इसे लागू करने के बीच अंतर था, जो ऊपर उल्लिखित उत्तर I से बेहतर समझाता है। –

37

डिफ़ॉल्ट मान सेट करें जब आप नया कॉलम जोड़ें:

create sequence rid_seq; 
alter table test add column rid integer default nextval('rid_seq'); 

वर्तमान कॉलम के लिए डिफ़ॉल्ट मान बदलकर मौजूदा डेटा परिवर्तित नहीं होता क्योंकि डेटाबेस जानने का कोई तरीका है जो मूल्यों को बदला जाना चाहिए है ; कॉलम मानों पर "इस कॉलम का डिफ़ॉल्ट मान" ध्वज नहीं है, वहां केवल डिफ़ॉल्ट मान है (मूल रूप से NULL क्योंकि आपने कुछ और निर्दिष्ट नहीं किया है) और वर्तमान मान (भी NULL) लेकिन "NULL" के बीच अंतर बताने का तरीका क्योंकि यह डिफ़ॉल्ट "और" पूर्ण है क्योंकि यह स्पष्ट रूप से पूर्ण पर सेट किया गया था "। तो, जब आप इसे दो चरणों में करते हैं:

  1. कॉलम जोड़ें।
  2. डिफ़ॉल्ट मान बदलें।

PostgreSQL आपके द्वारा अभी जोड़े गए कॉलम पर डिफ़ॉल्ट मान लागू नहीं करेगा। हालांकि, यदि आप कॉलम जोड़ते हैं और एक ही समय में डिफ़ॉल्ट मान की आपूर्ति करते हैं तो PostgreSQL जानता है कि कौन सी पंक्तियों में डिफ़ॉल्ट मान है (उनमें से सभी) ताकि यह मानों को आपूर्ति कर सके क्योंकि कॉलम जोड़ा गया है।

वैसे, आप शायद चाहते हैं कि स्तंभ भी पर एक शून्य नहीं:

create sequence rid_seq; 
alter table test add column rid integer not null default nextval('rid_seq'); 

और, a_horse_with_no_name के रूप में नोट, यदि आप केवल अपने test.rid स्तंभ के लिए rid_seq उपयोग करना चाहते हैं तो आप set its owner column को करना चाह सकते हैं test.rid ताकि अनुक्रम यदि स्तंभ निकाल दिया जाता है हटा दिया जाएगा:

alter sequence rid_seq owned by test.rid; 
+3

आप शायद उस कॉलम को अनुक्रम के "मालिक" बनाना चाहते हैं, ताकि PostgreSQL जानता है कि यह उस कॉलम से संबंधित है: 'reter rid_sequence स्वामी को test.rid' –

+0

में बदलने के लिए मौजूदा तालिका में "REQ0001-REQ000N" जैसे कस्टमाइज़ेशन अनुक्रम मान बनाना संभव है? – Angger

+0

@Aggger Sequences संख्यात्मक हैं इसलिए वास्तव में नहीं। आप दो स्तंभों को जोड़कर नकली बना सकते हैं या स्टैंड-अलोन अनुक्रम के साथ स्ट्रिंग को संयोजित कर सकते हैं। –

1

PostgreSQL में:

UPDATE your_table SET your_column = nextval('your_sequence') 
WHERE your_column IS NULL; 
संबंधित मुद्दे