2009-09-03 6 views
21

Bir tabloda iki alan üzerinde benzersiz bir kısıt oluşturmaya çalışıyorum. Bununla birlikte, birinin boş kalacağı olasılığı yüksektir. Sadece her ikisi de boş değilse benzersiz olmalarını isterim (name asla boş olmaz).Oracle'da benzersiz bir dizin nasıl oluşturabilirim, ancak boş değerleri yoksayabilir miyim?

create unique index "name_and_email" on user(name, email); 

tablo ve alan adlarına semantiğini Ignore ve bu ister mantıklı - Biraz uydurdum.

Bu alanlar üzerinde, null olmayan iki değer için benzersizliği zorlayacak benzersiz bir kısıtlama oluşturmanın bir yolu var, ancak name'un boş olmadığı ve email'un null olmadığı birden çok giriş varsa yok sayılıyor mu?

Bu soru SQL Server için ve ben cevap aynı olmadığını umuyorum: How do I create a unique constraint that also allows nulls?

cevap

33

Biz bir işlev tabanlı indeksi ile yapabilirsiniz. Aşağıdakiler, NVL2()'u kullanır, bildiğiniz gibi, ifade boş değilse ve değer boşsa farklı bir değer döndürür. Bunun yerine CASE()'u kullanabilirsiniz.

SQL> create table blah (name varchar2(10), email varchar2(20)) 
    2/

Table created. 

SQL> create unique index blah_uidx on blah 
    2  (nvl2(email, name, null), nvl2(name, email, null)) 
    3/

Index created. 

SQL> insert into blah values ('APC', null) 
    2/

1 row created. 

SQL> insert into blah values ('APC', null) 
    2/

1 row created. 

SQL> insert into blah values (null, '[email protected]') 
    2/

1 row created. 

SQL> insert into blah values (null, '[email protected]') 
    2/

1 row created. 

SQL> insert into blah values ('APC', '[email protected]') 
    2/

1 row created. 

SQL> insert into blah values ('APC', 'a[email protected]') 
    2/
insert into blah values ('APC', '[email protected]') 
* 
ERROR at line 1: 
ORA-00001: unique constraint (APC.BLAH_UIDX) violated 


SQL> 

Düzenleme

senin senaryo adına her zaman sadece böyle bir dizin gerekir doldurulur Çünkü:

SQL> create unique index blah_uidx on blah 
    2  (nvl2(email, name, null), email) 
    3/

Index created. 

SQL> 
+0

+1 FBI kurtarma ;-) – DCookie

+0

sayesinde dostum, sana şeref! –

İlgili konular