2009-09-03 10 views
21

Sto provando a creare un vincolo univoco su due campi in una tabella. Tuttavia, esiste un'alta probabilità che uno sia nullo. Richiedo solo che siano univoci se entrambi non sono nulli (name non sarà mai nullo).Come posso creare un indice univoco in Oracle ma ignorare i null?

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

ignorare la semantica dei nomi di tabella e di campo e se questo ha un senso - ho appena fatto un po 'su.

C'è un modo per creare un vincolo univoco su questi campi che impone l'univocità per due valori non nulli, ma ignora se ci sono più voci in cui name non è nullo e email è nullo?

Questa domanda è per SQL Server, e spero che la risposta non è la stessa: How do I create a unique constraint that also allows nulls?

risposta

33

Possiamo farlo con un indice basato su funzioni. Quanto segue fa uso di NVL2() che, come sapete, restituisce un valore se l'espressione non è nullo e un valore diverso se è nullo. Potresti usare invece CASE().

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', '[email protected]') 
    2/
insert into blah values ('APC', '[email protected]') 
* 
ERROR at line 1: 
ORA-00001: unique constraint (APC.BLAH_UIDX) violated 


SQL> 

Modifica

Perché nel tuo nome dello scenario sarà sempre popolato si avrà solo bisogno di un indice in questo modo:

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

Index created. 

SQL> 
+0

+1, FBI in soccorso ;-) Grazie – DCookie

+0

amico, grazie a te! –

Problemi correlati