Det kan vi gøre med et funktionsbaseret indeks. Det følgende gør brug af NVL2()
der som bekendt returnerer én værdi hvis udtrykket ikke er null og en anden værdi hvis det er null. Du kan bruge CASE()
i stedet.
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>
Rediger
Fordi i dit scenarie vil navn altid være udfyldt, behøver du kun et indeks som dette:
SQL> create unique index blah_uidx on blah
2 (nvl2(email, name, null), email)
3 /
Index created.
SQL>