2011-09-27 14 views
12

मैं एक टेबल में एक नई पंक्ति बनाने की कोशिश कर रहा हूं। तालिका पर दो बाधाएं हैं - एक कुंजी क्षेत्र (डीबी_आईडी) पर है, दूसरा एक मूल्य एनएनवी क्षेत्र में से एक होने के लिए एक मूल्य को बाधित करता है। जब मैं एक डालने करते हैं, मैं खेतों मैं सम्मिलित करने के लिए कोशिश कर रहा हूँ के रूप में प्रमुख क्षेत्र शामिल नहीं है, फिर भी मैं इस त्रुटि हो रही है:डालने के दौरान अद्वितीय बाधा उल्लंघन: क्यों? (ओरेकल)

unique constraint (N390.PK_DB_ID) violated 

यहाँ एसक्यूएल कि त्रुटि का कारण बनता है है:

insert into cmdb_db 
    (narrative_name, db_name, db_type, schema, node, env, server_id, state, path) 
values 
    ('Test Database', 'DB', 'TYPE', 'SCH', '', 'SB01', 381, 'TEST', '') 

एकमात्र चीज जिसे मैं चालू करने में सक्षम हूं, यह संभावना है कि ओरेकल मैन्युअल रूप से उपयोग में आने वाले डीबी_आईडी को आवंटित करने की कोशिश कर रहा हो। इस डेटाबेस में डेटा किसी भी तरह से किसी डेटाबेस डेटाबेस से बहाल/स्थानांतरित किया गया था, लेकिन मेरे पास विवरण नहीं है कि यह कैसे किया गया था।

किसी भी विचार?

उत्तर

34

मुमकिन है, जब से तुम DB_ID स्तंभ के लिए एक मूल्य प्रदान नहीं कर रहे हैं, कि मूल्य डालने ट्रिगर मेज पर परिभाषित करने से पहले एक पंक्ति-स्तर से डाला जा रहा है। वह ट्रिगर, अनुमानतः, अनुक्रम से मूल्य का चयन कर रहा है।

चूंकि डेटा उत्पादन डेटाबेस से (संभवतः हाल ही में) स्थानांतरित हो गया था, इसलिए मेरा दांव यह होगा कि जब डेटा की प्रतिलिपि बनाई गई थी, तो अनुक्रम भी संशोधित नहीं किया गया था। मुझे लगता है कि अनुक्रम उन मानों को उत्पन्न कर रहा है जो सबसे बड़े DB_ID से बहुत कम हैं जो वर्तमान में त्रुटि के कारण तालिका में हैं।

आप अनुक्रम यह निर्धारित करने के अनुक्रम किया जा रहा है ट्रिगर देख रही है और एक

SELECT <<sequence name>>.nextval 
    FROM dual 

कर रहे हैं और

SELECT MAX(db_id) 
    FROM cmdb_db 

हैं करने के लिए है कि तुलना द्वारा इस संदेह की पुष्टि कर सकता है, के रूप में मुझे लगता है, डेटाबेस में पहले से मौजूद मानों को उत्पन्न कर रहा है, आप अनुक्रमित वृद्धि कर सकते हैं जब तक कि यह अप्रयुक्त मान उत्पन्न नहीं कर रहा हो या आप इसे INCREMENT को बहुत बड़ा करने के लिए बदल सकते हैं, अगली बार एक बार प्राप्त कर सकते हैं, औरसेट कर सकते हैं 210 वापस 1।

+9

+1 संवेदनशील अनुमान – APC

1

ऐसा लगता है कि आप प्राथमिक कुंजी फ़ील्ड DB_ID के लिए कोई मान प्रदान नहीं कर रहे हैं। यदि वह प्राथमिक कुंजी है, तो आपको उस कॉलम के लिए एक अद्वितीय मान प्रदान करना होगा। इसे उपलब्ध कराने का एकमात्र तरीका डेटाबेस ट्रिगर बनाना होगा, जो सम्मिलित है, एक मूल्य प्रदान करेगा, जो कि अनुक्रम से प्राप्त होता है।

यदि यह किसी अन्य डेटाबेस से बहाली है और इस नए उदाहरण पर अनुक्रम है, तो यह एक मूल्य का पुन: उपयोग करने का प्रयास कर रहा है। यदि पुराने डेटा में 1 - 1000 से अनन्य कुंजी थी और आपका वर्तमान अनुक्रम 500 पर है, तो यह उन मानों को उत्पन्न करेगा जो पहले से मौजूद हैं। यदि इस तालिका के लिए अनुक्रम मौजूद है और यह इसका उपयोग करने का प्रयास कर रहा है, तो आपको अनुक्रम के वर्तमान मूल्य के साथ अपनी तालिका में मानों को मेल करना होगा।

आप अनुक्रम के वर्तमान मूल्य को देखने के लिए (अगर यह निश्चित रूप से मौजूद है) जैसे आप अपने DB में पहले से मौजूद प्राथमिक कुंजी डुप्लिकेट रहे

+0

डेटाबेस पर मेरी जानकारी कहती है कि जब कोई नई पंक्ति डाली जाती है तो कुंजी स्वचालित रूप से जेनरेट की जानी चाहिए - यही कारण है कि मैं डीबी_आईडी के लिए मूल्य प्रदान नहीं करता हूं। इसके अलावा, यह वही तकनीक डेटाबेस में अन्य तालिकाओं पर काम करती है जो समान हैं - उनके पास स्वचालित रूप से जेनरेट की गई आईडी कुंजी है। – Sean

+0

क्या आप डेटा वातावरण को क्वेरी करने में सक्षम हैं यह देखने के लिए कि नए वातावरण में आवश्यक ट्रिगर्स/अनुक्रम मौजूद हैं या नहीं? शायद पुराने वातावरण से सब कुछ नहीं लाया गया था। –

1

आपका त्रुटि लग रहा है SEQUENCE_NAME.CURRVAL उपयोग कर सकते हैं। पहचान शब्द की तरह कुछ उपयोग करके आपको अपनी प्राथमिक कुंजी को लागू करने के लिए अपने एसक्यूएल कोड को संशोधित करना चाहिए।

CREATE TABLE [DB] (
    [DBId] bigint NOT NULL IDENTITY, 
    ... 

    CONSTRAINT [DB_PK] PRIMARY KEY ([DB] ASC), 

); 
+1

पहचान ओरेकल में मान्य कीवर्ड नहीं है। –

+0

ओरेकल –

+1

के लिए यह एक अमान्य बयान है आप, महोदय, सही हैं। मेरा समाधान एसक्यूएल में काम करता है, ओरेकल में नहीं। यदि आप ओरेकल में एसक्यूएल की पहचान को डुप्लिकेट करना चाहते हैं, तो आप अनुक्रमों का उपयोग करना चाहते हैं [लिंक] (http://www.techonthenet.com/oracle/sequences.php) @ जस्टिन_Cव के जवाब में एक अच्छा कार्यान्वयन है। –

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