2010-03-10 12 views
6

मेरे पास परिभाषित बोले के रूप में दो टेबल ए और बी हैं। तालिका एक मेंप्राथमिक कुंजी संयोजन कैसे हो सकता है जिसमें शून्य मान हो सकते हैं?

create table A 
(
    A_1 varchar2(10) NOT NULL, 
    A_2 varchar2(10), 
    A_3 varchar2(10), 
    constraint A_PK primary key (A_1,A_2) 
) 
TABLE A DATA 
A_1  |A_2 |A_3 
1111  abc  some_text1 
1111  null some_text1 
1112  abc  some_text2 
1113  def  some_text3 

    create table B 
    (
    B_1 varchar2(10) NOT NULL, 
    B_2 varchar2(10), 
    B_3 varchar2(10), 
    constraint B_PK primary key (B_1,B_2,B_3), 
    constraint B_FK foreign key (B_1,B2) references A(A_1,A_2) 
    ) 
TABLE B DATA 
B_1 | B_2 |B_3 
1111 abc  text1 
1111 null  text2 
1111 null  text3 
1111 null  text4 

A_2 स्तंभ कभी कभी अशक्त हो सकता है लेकिन A_1 और A_2 के संयोजन हमेशा अद्वितीय है। मुझे प्राथमिक कुंजी का हिस्सा बनने की आवश्यकता है क्योंकि तब मैं केवल ए_1 और ए_2 को तालिका बी में विदेशी कुंजी के रूप में संदर्भित कर सकता हूं। यहां समस्या प्राथमिक कुंजी शून्य नहीं हो सकती है। इस समस्या को हल कैसे करें? किसी भी प्रतिक्रिया की अत्यधिक सराहना की जाएगी

उत्तर

21

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

2

आपके पास प्राथमिक कुंजी में शून्य स्तंभ नहीं हो सकता है, लेकिन आप इसके बजाय शून्य कॉलम के साथ एक अद्वितीय अनुक्रमणिका बना सकते हैं। इस Oracle 10g में काम करने के लिए पाने के लिए, मैं भी स्पष्ट रूप से मेज पर एक अद्वितीय contraint जोड़ने के लिए किया था:

create table t1 (a1 integer not null, 
       a2 integer, 
       a3 integer); 

create unique index t1_uk1 on t1(a1, a2); 

alter table t1 add constraint t1_cuk1 unique (a1, a2); 

create table b1 (b1 integer not null, b2 integer, b3 integer); 

create index b1_idx1 on b1 (b1, b2); 

alter table b1 add constraint b1_fk1 
    foreign key (b1, b2) references t1 (a1, a2); 

हालांकि, मैं इस स्थापना का परीक्षण करने की कोशिश की है, और यह है कि मैं उम्मीद यह होगा काम नहीं करता। उदाहरण के लिए:

SQL> insert into t1 values (1, null, 1); 

1 row created. 

SQL> insert into b1 values (1, 1, 1); 
insert into b1 values (1, 1, 1) 
* 
ERROR at line 1: 
ORA-02291: integrity constraint (B1_FK1) violated - parent key not 
found 

ठीक है, तो यही उम्मीद है। माता-पिता में कोई पंक्ति है, तो एक पंक्ति बच्चे तालिका में अनुमति नहीं किया जाना चाहिए, हालांकि:

SQL> insert into b1 values (2, null, 1); 

1 row created. 

ऐसा लगता है कि यह सिर्फ उस पंक्ति में नाकाम रहने के बिना डाला करते हैं, भले ही वहाँ 2 के साथ t1 में कोई भी पंक्ति, अशक्त हैं बिलकुल!

SQL> commit; 

Commit complete. 

SQL> select * from t1; 

     A1   A2   A3 
---------- ---------- ---------- 
     1      1 

SQL> select * from b1; 

     B1   B2   B3 
---------- ---------- ---------- 
     2      1 

मैं, इस व्यवहार से आश्चर्यचकित था के रूप में t1 पर अद्वितीय सूचकांक बर्ताव करता है कि आप इसे करने के लिए उम्मीद करेंगे के रूप में (केवल 1 पंक्ति, 1 के साथ डाला जा सकता है अशक्त आदि)।

1

यदि आप प्राथमिक कुंजी पर "डिफ्रैबल प्रारंभिक रूप से स्थगित" का उपयोग करते हैं, तो आपके पास शून्य मान हो सकते हैं ...

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

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