मैं एक Microsoft सुविधा के पास रहता हूँ और काम करता हूँ। जैसे, हमारे कई वर्तमान कर्मचारी Microsoft के पूर्व कर्मचारी हैं जो SQL सर्वर पृष्ठभूमि से आते हैं। SQL सर्वर आपको एक पहचान स्तंभ के साथ एक तालिका बनाने देता है। Oracle 12c अब आपको ऐसा ही करने देता है। इससे उन लोगों को मदद मिलनी चाहिए जो SQL सर्वर से Oracle में संक्रमण कर रहे हैं। यह किसी कंपनी को SQL सर्वर, या किसी अन्य डेटाबेस से किसी एप्लिकेशन को अधिक आसानी से पोर्ट करने देता है जो IDENTITY कॉलम को Oracle में अनुमति देता है।
सबसे पहले मैं पहचान कॉलम के साथ एक टेबल बनाउंगा और इसे डेटा की कुछ पंक्तियों के साथ पॉप्युलेट करूंगा।
एसक्यूएल> टेबल टेस्ट_टैब बनाएं (2 आईडी नंबर डिफॉल्ट ऑन डिफॉल्ट ऑन न्यूल ऐस आइडेंटिटी, 3 वैल VARCHAR2(20));टेबल क्रिएट किया गया। create.SQL> test_tab (val) मानों ('मेरी दूसरी पंक्ति') में डालें; 1 पंक्ति बनाई गई। SQL> प्रतिबद्ध; पूरा करें।
ध्यान दें कि मैंने आईडी कॉलम में कोई मान नहीं डाला है। अब तालिका को क्वेरी करते हैं।
SQL> test_tab से * चुनें; आईडी VAL------------------------------------ मेरी पहली पंक्ति2 मेरी दूसरी पंक्ति
जैसा कि आप देख सकते हैं, मेरी आईडी मान आपकी अपेक्षा के अनुरूप जोड़े गए हैं। मेरे टेबल निर्माण में, मैंने इस पहचान कॉलम को परिभाषित किया है: डिफॉल्ट ऑन न्यूल द्वारा जेनरेट किया गया
BY DEFAULT क्लॉज का अर्थ है कि यदि आप अपने INSERT स्टेटमेंट में इसे छोड़ देते हैं तो Oracle स्वचालित रूप से अनुक्रम में अगला मान निर्दिष्ट करेगा। यदि आप इसे शामिल करते हैं, तो Oracle आपके निर्दिष्ट मान का उपयोग करेगा। इस पर विचार करें:
SQL> test_tab मानों (4, 'निर्दिष्ट आईडी =4') में डालें; 1 पंक्ति बनाई गई। SQL> प्रतिबद्ध; पूर्ण प्रतिबद्ध करें। SQL> test_tab से * चुनें; आईडी VAL------------------------------- 1 मेरी पहली पंक्ति 2 मेरी दूसरी पंक्ति 4 निर्दिष्ट आईडी=4
जैसा कि आप देख सकते हैं, क्योंकि मैंने स्पष्ट रूप से कहा है कि आईडी =4 और ओरेकल ने उस मान को पास कर दिया है। क्या होता है जब मैं अगला मान डालने की कोशिश करता हूं, जो 3 होना चाहिए?
एसक्यूएल> test_tab (वैल) मानों में डालें ('आईडी =4 के बाद मेरी पंक्ति'); 1 पंक्ति बनाई गई। SQL> प्रतिबद्ध; पूर्ण प्रतिबद्ध करें। SQL> test_tab से * चुनें; आईडी VAL------------------------------- 1 मेरी पहली पंक्ति 2 मेरी दूसरी पंक्ति 4 निर्दिष्ट आईडी=4 3 आईडी के बाद मेरी पंक्ति =4उपरोक्त ने मेरी अपेक्षा के अनुरूप काम किया। अगले उपलब्ध आईडी मान का उपयोग किया गया था। लेकिन क्या अगला इंसर्ट '4' या '5' का उपयोग करेगा?
SQL> test_tab (val) मानों ('मेरी पांचवीं पंक्ति') में डालें;1 पंक्ति बनाई गई। टेस्ट_टैब; आईडी VAL------------------------------- 1 मेरी पहली पंक्ति 2 मेरी दूसरी पंक्ति 4 निर्दिष्ट आईडी=4 3 आईडी के बाद मेरी पंक्ति =4 4 मेरी पांचवीं पंक्तिउह ओह! डुप्लिकेट मान की अनुमति थी। मुझे उम्मीद है कि "पहचान" मूल्य की अवधारणा को लागू करने के लिए प्राथमिक कुंजी बाधा उत्पन्न की जाएगी, लेकिन ऐसा नहीं होता है। क्या बाधाएं मौजूद हैं?
एसक्यूएल> का चयन करें बाधा_नाम, बाधा_प्रकार, तालिका_नाम, user_constraints से search_condition;CONSTRAINT_NAME सी TABLE_NAME-------------------- --------------------------------SEARCH_CONDITION--------------- -------------------------------------------------- ---------------SYS_C004978 C TEST_TAB"ID" खाली नहीं हैतो एकमात्र बाधा एक पूर्ण जांच बाधा नहीं है। अब उस अंतिम पंक्ति को हटाते हैं और एक PK बाधा जोड़ते हैं।
SQL> test_tab से हटाएं जहां val='my पांचवीं पंक्ति';1 पंक्ति हटा दी गई है। (आईडी);तालिका बदल दी गई।अब मैं यह सुनिश्चित करूँगा कि मेरे पास परीक्षण करने के लिए कुछ डेटा है। 6, 'स्पष्ट रूप से सेट आईडी =6'); 1 पंक्ति बनाई गई। SQL> प्रतिबद्ध; पूर्ण प्रतिबद्ध। SQL> test_tab से * चुनें; आईडी VAL------------------------------- 1 मेरी पहली पंक्ति 2 मेरी दूसरी पंक्ति 4 निर्दिष्ट आईडी=4 3 आईडी के बाद मेरी पंक्ति =4 5 pk बाधा के बाद 6 स्पष्ट रूप से id =66 पंक्तियों का चयन किया गया। इसलिए मैंने स्पष्ट रूप से आईडी =6 जोड़ा। यदि ऐसा है जब मैंने स्पष्ट रूप से आईडी =4 जोड़ा है, तो मेरा अगला सम्मिलन आईडी =6 का उपयोग करने का प्रयास करेगा और पीके बाधा के साथ, एक अपवाद फेंक दिया जाएगा।
SQL> test_tab (val) मानों में डालें (' ID=6' के बाद); test_tab (val) मानों में डालें ('ID=6 के बाद')*त्रुटि 1:ORA-00001 पर:अद्वितीय बाधा (PEASLAND.TEST_TAB_PK) का उल्लंघन किया गयातो कहानी का नैतिक यह है कि यदि आप डिफ़ॉल्ट पर उपयोग करते हैं, तो पहचान मूल्य टकराव को संभालने के लिए तैयार रहें। डिफ़ॉल्ट ON DEFAULT के बजाय हमेशा होता है। हमेशा के साथ, Oracle हमेशा अनुक्रम संख्या जनरेटर का उपयोग करेगा। यदि आप एक आईडी मान निर्दिष्ट करने का प्रयास करते हैं, तो एक अपवाद होगा। मान (1,'पहली पंक्ति'); test_tab2(id,val) मानों (1,'पहली पंक्ति') में डालें *पंक्ति 1 पर त्रुटि:ORA-32795:हमेशा जेनरेट किए गए पहचान कॉलम में सम्मिलित नहीं किया जा सकता दृश्य *_TAB_COLUMNS आपको दिखा सकता है कि तालिका में कौन से स्तंभ पहचान स्तंभ हैं।
SQL> user_tab_columns से column_name,identity_column चुनें जहां table_name='TEST_TAB';COLUMN_NAME IDE-------------- - --- आईडी यसवाल नहींयदि आप अपनी तालिकाओं में पहचान कॉलम का उपयोग करते हैं, तो यह सुनिश्चित करने के लिए परीक्षण करने में सावधानी बरतें कि आप समझते हैं कि यह आपके आवेदन के लिए सही ढंग से काम करता है। मुझे आश्चर्य हुआ कि एक PK या UNIQUE बाधा स्वचालित रूप से शामिल नहीं थी जिसने मुझे एक डुप्लिकेट मान जोड़ने की अनुमति दी।