2009-12-03 20 views
25

मैं एक ऑरैकल टेबल का उपयोग कर रहा हूं और चार स्तंभों पर एक अद्वितीय बाधा उत्पन्न की है। क्या इन स्तंभों में बाधा के भीतर उनमें न्यूल हो सकता है?एकाधिक कॉलम पर अद्वितीय बाधा

+3

मुझे ऐसा लगता है कि यह करने के लिए इस सवाल का जवाब पता लगाने के लिए बहुत मामूली बात है यह एक परीक्षण के साथ। क्या ऐसा करने में संभवतः एक मिनट से ज्यादा समय लग सकता है? –

+7

हाँ - आप सही हैं। लेकिन मैंने उत्तर से अन्य जानकारी सीखी है कि विन्सेंट, एम्बर और शूवर ने पोस्ट किया है। – Nicks

उत्तर

41

आपके कॉलम में एनयूएलएल हो सकते हैं जब तक कॉलम निर्दिष्ट न हों। आप (एक ही कॉलम का कोई दो सेट की अनुमति दी जाएगी जब तक कि सभी स्तंभों शून्य कर रहे हैं) लेकिन NULLs उसमें केवल एक ही स्टोर करने के लिए सक्षम हो जाएगा:

SQL> CREATE TABLE t (id1 NUMBER, id2 NUMBER); 

Table created 
SQL> ALTER TABLE t ADD CONSTRAINT u_t UNIQUE (id1, id2); 

Table altered 
SQL> INSERT INTO t VALUES (1, NULL); 

1 row inserted 
SQL> INSERT INTO t VALUES (1, NULL); 

INSERT INTO t VALUES (1, NULL) 

ORA-00001: unique constraint (VNZ.U_T) violated 

SQL> /* you can insert two sets of NULL, NULL however */ 
SQL> INSERT INTO t VALUES (NULL, NULL); 

1 row inserted 
SQL> INSERT INTO t VALUES (NULL, NULL); 

1 row inserted 
2

ओरेकल में दो नल को बराबर नहीं माना जाता है, इसलिए इन कॉलम में उनमें शून्य हो सकती है।

5

हां, ओरेकल अद्वितीय बाधाओं को नल सामग्री के साथ कॉलम रखने की अनुमति देता है, लेकिन प्राथमिक कुंजी बाधाओं में नल मान वाले कॉलम नहीं हो सकते हैं। (संपादित: "... शून्य कॉलम ..." था, लेकिन नीचे मेरा उदाहरण दिखाता है कि सत्य नहीं है। पीके में कॉलम को शून्य के रूप में परिभाषित किया जा सकता है, लेकिन इसमें शून्य नहीं हो सकता है।)

आपके पास कोई नहीं हो सकता एक ही कॉलम के साथ अद्वितीय बाधा और एक प्राथमिक कुंजी बाधा।

SQL> create table stest (col1 integer not null, col2 integer null); 

Table created. 

SQL> alter table stest add constraint stest_uq unique (col1, col2); 

Table altered. 

SQL> insert into stest values (1, 3); 

1 row created. 

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

1 row created. 

SQL> insert into stest values (1, null); 
insert into stest values (1, null) 
* 
ERROR at line 1: 
ORA-00001: unique constraint (SUSAN_INT.STEST_UQ) violated 

SQL> insert into stest values (2, null); 

1 row created. 

SQL> commit; 

Commit complete. 

SQL> select * from stest; 

     COL1  COL2 
---------- ---------- 
     1   3 
     1 
     2 

SQL> alter table stest add constraint stest_pk PRIMARY KEY (col1, col2); 
alter table stest add constraint stest_pk PRIMARY KEY (col1, col2) 
                  * 
ERROR at line 1: 
ORA-01449: column contains NULL values; cannot alter to NOT NULL 

SQL> truncate table stest; 

Table truncated. 

SQL> alter table stest add constraint stest_pk PRIMARY KEY (col1, col2); 
alter table stest add constraint stest_pk PRIMARY KEY (col1, col2) 
              * 
ERROR at line 1: 
ORA-02261: such unique or primary key already exists in the table 

SQL> alter table stest drop constraint stest_uq; 

Table altered. 

SQL> alter table stest add constraint stest_pk PRIMARY KEY (col1, col2); 

Table altered. 
संबंधित मुद्दे