एक बाधा और एक सूचकांक अलग तार्किक संस्थाएं हैं। उदाहरण के लिए, एक अद्वितीय बाधा 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.
लेकिन अगर हम एक सीधे अद्वितीय गैर-कार्य आधारित सूचकांक के बारे में बात कर रहे हैं, तो शायद अपेक्षाकृत कम मामले हैं जहां यह वास्तव में बाधा पैदा करने के बजाय सूचकांक बनाने के लिए अधिक समझ में आता है। दूसरी ओर, अपेक्षाकृत कम मामले ऐसे होते हैं जहां व्यवहार में इससे बहुत फर्क पड़ता है। आप लगभग कभी भी एक विदेशी कुंजी बाधा घोषित नहीं करना चाहेंगे जो प्राथमिक कुंजी बाधा के बजाय एक अद्वितीय बाधा का संदर्भ देती है, इसलिए आप शायद ही कभी इंडेक्स बनाकर और बाधा नहीं बनाकर कुछ खो देते हैं।