2012-11-20 9 views
27

मैंने सोचा कि यह आसान होगा, लेकिन मैं अपने डीबी 2 डेटाबेस में AUTO_INCREMENT का उपयोग नहीं कर सकता। मैंने कुछ खोज की और लोग "डिफ़ॉल्ट द्वारा जेनरेट" का उपयोग कर रहे हैं, लेकिन यह मेरे लिए काम नहीं करता है।db2 में AUTO_INCREMENT कैसे करें?

यदि यह मदद करता है, तो यहां वह तालिका है जिसे मैं एसआईडी के साथ ऑटो वृद्धि के रूप में बनाना चाहता हूं।

create table student(
     sid integer NOT NULL <auto increment?> 
     sname varchar(30), 
     PRIMARY KEY (sid) 
    ); 

किसी भी पॉइंटर्स की सराहना की जाती है।

उत्तर

44

आप के लिए एक पहचान स्तंभ कहा जाता है देख रहे हैं:

create table student (
    sid integer not null GENERATED ALWAYS AS IDENTITY (START WITH 1 INCREMENT BY 1) 
    ,sname varchar(30) 
    ,PRIMARY KEY (sid) 
); 

एक अनुक्रम ऐसा करने के लिए एक और विकल्प है, लेकिन आप अपनी स्थिति के अनुसार determine which one is proper की जरूरत है। अधिक जानकारी के लिए इसे पढ़ें comparing sequences to identity columns

+0

धन्यवाद इयान। यह वह जगह है जहां मैंने शुरू किया था। मुझे यकीन नहीं है कि क्यों, लेकिन किसी भी कारण से इस क्वेरी का "सामान्य हमेशा" हिस्सा पहचाना नहीं गया है। मुझे सही माता-पिता की गलती हुई त्रुटि मिलती है ... एक संकेतक यह कीवर्ड को दोबारा नहीं बदलता है। – Matt

+0

डीबी 2 का कौन सा संस्करण आप चल रहे हैं, और किस प्लेटफॉर्म पर? –

+0

पहचान अनुक्रम की घोषणा के बाद आप एक अल्पविराम ('','') खो रहे हैं, लेकिन यह अन्यथा _my_ डीबी 2 परिनियोजन पर काम करता है (हालांकि मैंने जर्नलिंग चालू नहीं की है, इसलिए, मैं प्राथमिक कुंजी घोषित नहीं कर सकता इस समय)। –

5

आपको अनुक्रम वस्तु के साथ एक ऑटो-वृद्धि फ़ील्ड बनाना होगा (यह ऑब्जेक्ट एक संख्या अनुक्रम उत्पन्न करता है)।

उपयोग के अनुसार तैयार करते SEQUENCE वाक्य रचना:

CREATE SEQUENCE seq_person 
    MINVALUE 1 
    START WITH 1 
    INCREMENT BY 1 
    CACHE 10 

कोड ऊपर seq_person कहा जाता है एक दृश्य वस्तु, कि 1 के साथ शुरू होता है और 1. द्वारा बढ़ेगी, जब यह भी प्रदर्शन के लिए अधिकतम 10 मान कैश होगा बनाता है। कैश विकल्प निर्दिष्ट करता है कि तेजी से पहुंच के लिए स्मृति में कितने अनुक्रम मान संग्रहीत किए जाएंगे।

INSERT INTO Persons (P_Id,FirstName,LastName) 
    VALUES (seq_person.nextval,'Lars','Monsen') 

SQL विवरण के ऊपर एक सम्मिलित होगा:

"व्यक्तियों" तालिका में एक नया रिकार्ड सम्मिलित करने के लिए, हम nextval समारोह का उपयोग करना होगा (इस समारोह seq_person अनुक्रम से अगले मान प्राप्त करता है) "व्यक्ति" तालिका में नया रिकॉर्ड। "P_Id" कॉलम को seq_person अनुक्रम से अगला नंबर असाइन किया जाएगा। "फर्स्टनाम" कॉलम "लार्स" पर सेट किया जाएगा और "LastName" कॉलम "मॉन्सन" पर सेट किया जाएगा।

+0

जबकि मैं दूंगा कि डीबी 2 में अनुक्रम हैं, और यह उनके लिए एक उपयोग है (यदि मुझे सही याद है, तो ऑटो-जेन कॉलम कवर के तहत उसी प्रकार की ऑब्जेक्ट का उपयोग कर सकते हैं), उस पृष्ठ पर डीबी 2 सूचीबद्ध नहीं है। .. क्या आपने ओरेकल सेटअप की प्रतिलिपि बनाई है? ध्यान रखें कि ओरेकल और डीबी 2 (संस्करण पर निर्भर करता है) के बीच कई _other_ बड़े अंतर हैं, इसलिए आप केवल अंधाधुंध प्रतिलिपि नहीं बना सकते हैं। (मुझे लगता है कि मुझे डब्ल्यू 3 स्कूल्स में विश्वास की कमी की कमी है, बल्कि यहां उचित है: न केवल वे डीबी 2 गायब हैं, बल्कि पोस्टग्रेएसक्यूएल और डर्बी भी हैं, जिनमें से सभी का उपयोग आमतौर पर किया जाता है ... शायद एक्सेस से अधिक) –

+0

@ क्लॉकवर्क-म्यूज़न - आप सही हैं जबकि इस तरह का निर्माण डीबी 2 में काम करेगा सिंटैक्स अलग है। – Hogan

1

"भविष्य सुरक्षित" दृश्य बनाने के लिए कुछ वैकल्पिक पैरामीटर जोड़े गए।

CREATE SEQUENCE <NAME> 
    START WITH 1 
    INCREMENT BY 1 
    NO MAXVALUE 
    NO CYCLE 
    CACHE 10; 
1

नमस्ते यदि आप अभी भी तालिका बनाते समय AUTO_INCREMENT के रूप में स्तंभ बनाने में सक्षम नहीं हैं।के रूप में एक काम पहले चारों ओर तालिका बनाने है कि:

तालिका छात्र ( sid पूर्णांक नहीं NULL SNAME varchar (30), प्राथमिक कुंजी (SID) ) बनाने के;

और फिर स्पष्ट रूप से निम्नलिखित

बदलने तालिका छात्र बदल स्तंभ sid सेट पहचान डिफ़ॉल्ट रूप से जेनरेट हुई का उपयोग कर

या

बदलने तालिका छात्र बदल स्तंभ बू स्तंभ बदलने की कोशिश डेफॉल्ट द्वारा निर्धारित सेट सेट (पहचान के साथ 100)

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