2011-09-22 24 views
34

क्या कोई स्पष्ट कर सकता है कि अद्वितीय बाधा (ओरेकल) के बिना अद्वितीय इंडेक्स रखने का क्या उद्देश्य है? उदाहरण के लिए,ओरेकल अद्वितीय बाधा और अद्वितीय सूचकांक

create table test22(id int, id1 int, tmp varchar(20)); 
create unique index idx_test22 on test22(id); 
insert into test22(id, id1, tmp) values (1, 2, 'aaa'); // ok 
insert into test22(id, id1, tmp) values (1, 2, 'aaa'); // fails, ORA-00001: unique 
    // constraint (TEST.IDX_TEST22) violated 

अब तक यह लग रहा है की कोई समस्या मौजूद है। लेकिन

create table test33(id int not null primary key, 
test22_id int not null, 
foreign key(test22_id) references test22(id)); 

भी "ORA-02270: no matching unique or primary key for this column-list" के साथ विफल रहता है। मैं इस व्यवहार से पूरी तरह उलझन में हूं। क्या कोई बाधा है या नहीं?

ऐसे कई लेख हैं जो बताते हैं कि अद्वितीय सूचकांक के बिना एक अद्वितीय बाधा क्यों हो सकती है; यह स्पष्ट है और सही समझ में आता है। हालांकि, मैं बिना किसी बाधा के अद्वितीय सूचकांक के कारण को समझता हूं।

उत्तर

39

एक बाधा और एक सूचकांक अलग लॉजिकल इकाइयां हैं। उदाहरण के लिए, एक अद्वितीय बाधा USER_CONSTRAINTS (या ALL_CONSTRAINTS या DBA_CONSTRAINTS) में दिखाई दे रही है। एक सूचकांक USER_INDEXES (या ALL_INDEXES या DBA_INDEXES) में दिखाई देता है।

एक अनूठी बाधा एक इंडेक्स द्वारा लागू की जाती है हालांकि यह एक गैर-अद्वितीय इंडेक्स का उपयोग करके एक अद्वितीय बाधा को लागू करने के लिए संभव है (और कभी-कभी आवश्यक)। एक निर्विवाद अद्वितीय बाधा, उदाहरण के लिए, एक गैर-अद्वितीय सूचकांक का उपयोग करके लागू किया जाता है। यदि आप कॉलम पर एक गैर-अद्वितीय अनुक्रमणिका बनाते हैं और बाद में एक अनूठी बाधा उत्पन्न करते हैं, तो आप अद्वितीय बाधा को लागू करने के लिए उस गैर-अद्वितीय अनुक्रमणिका का भी उपयोग कर सकते हैं।

प्रैक्टिस में, एक अद्वितीय इंडेक्स एक अद्वितीय, गैर-डिफ्रैरेबल बाधा की तरह काम करता है जिसमें यह एक ही त्रुटि उत्पन्न करता है कि अद्वितीय बाधाओं के कार्यान्वयन के बाद से एक अद्वितीय बाधा उत्पन्न होती है। लेकिन यह बिल्कुल समान नहीं है क्योंकि कोई बाधा नहीं है। इसलिए, जैसा कि आपने देखा है, वहां कोई अनूठी बाधा नहीं है, इसलिए आप कॉलम का संदर्भ देने वाली विदेशी कुंजी बाधा नहीं बना सकते हैं।

ऐसे मामले हैं जहां आप एक अद्वितीय इंडेक्स बना सकते हैं जिसे आप एक अद्वितीय बाधा नहीं बना सकते हैं। एक फ़ंक्शन-आधारित इंडेक्स, उदाहरण के लिए, जो सशर्त विशिष्टता को लागू करता है। अगर मैं एक मेज है कि तार्किक हटाए गए समर्थित बनाने लेकिन सुनिश्चित करें कि COL1 सभी गैर नष्ट कर दिया पंक्तियों के लिए अद्वितीय है

SQL> ed 
Wrote file afiedt.buf 

    1 CREATE TABLE t (
    2 col1 number, 
    3 deleted_flag varchar2(1) check(deleted_flag in ('Y','N')) 
    4*) 
SQL>/

Table created. 

SQL> create unique index idx_non_deleted 
    2  on t(case when deleted_flag = 'N' then col1 else null end); 

Index created. 

SQL> insert into t values(1, 'N'); 

1 row created. 

SQL> insert into t values(1, 'N'); 
insert into t values(1, 'N') 
* 
ERROR at line 1: 
ORA-00001: unique constraint (SCOTT.IDX_NON_DELETED) violated 


SQL> insert into t values(1, 'Y'); 

1 row created. 

SQL> insert into t values(1, 'Y'); 

1 row created. 

लेकिन अगर हम एक सीधे अद्वितीय गैर समारोह आधारित सूचकांक के बारे में बात कर रहे हैं, वहाँ शायद अपेक्षाकृत हैं करना चाहते थे कुछ मामलों जहां यह वास्तव में बाधा उत्पन्न करने के बजाय सूचकांक बनाने के लिए और अधिक समझ में आता है। दूसरी ओर, अपेक्षाकृत कुछ मामले हैं जहां यह अभ्यास में बहुत अंतर डालता है। आप लगभग एक विदेशी कुंजी बाधा घोषित नहीं करना चाहते थे जो प्राथमिक कुंजी बाधा के बजाए एक अद्वितीय बाधा का संदर्भ देता था ताकि आप केवल सूचकांक बनाने और बाधा उत्पन्न न करके कुछ खो जाए।

+0

आपके उत्तर के लिए धन्यवाद, अब यह स्पष्ट हो रहा है। मुझे वास्तव में पसंद नहीं है, दोनों मामलों के लिए बाधा और अद्वितीय सूचकांक के साथ एक ही त्रुटि कोड ('ORA-00001') है। – a1ex07

+0

उत्कृष्ट, "अंतिम कहने" के लिए धन्यवाद कि क्या आप एक अद्वितीय एफबीआई पर एक अद्वितीय बाधा बना सकते हैं। – orbfish

+0

धन्यवाद - यह पाया गया है कि दोनों के बीच अंतर का यह एकमात्र स्पष्ट स्पष्टीकरण है। मैंने कुछ उल्लेख देखा है कि एक अद्वितीय बाधा घोषित करने से ऑप्टिमाइज़र को अद्वितीय सूचकांक की तुलना में अधिक जानकारी मिलती है ...क्या यह सच है, और क्या इसका मतलब यह है कि एक अनूठी बाधा बिना किसी बाधा के अद्वितीय इंडेक्स पर कुछ प्रदर्शन लाभ प्रदान कर सकती है? – Mike

1

इस संदर्भ में उपयोगी एक और बिंदु यह है: मौजूदा अद्वितीय बाधा को अक्षम/छोड़ना अंतर्निहित अद्वितीय अनुक्रमणिका को नहीं छोड़ता है। आपको अद्वितीय सूचकांक को स्पष्ट रूप से छोड़ना होगा।

+2

यह सही नहीं है (कम से कम 10 जी के लिए)। वास्तव में आपको सूचकांक रखने के लिए अद्वितीय बाधा छोड़ते समय 'KEEP INDEX' निर्दिष्ट करना होगा। इसके अलावा, सूचकांक अद्वितीय नहीं होना चाहिए। – a1ex07

+0

दिलचस्प। हालांकि, यह 11 जी से इतना नहीं है। – Syamjith

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