Chúng ta có thể làm điều này với một chỉ mục dựa trên chức năng. Phần sau sử dụng NVL2()
như bạn đã biết, trả về một giá trị nếu biểu thức không null và một giá trị khác nếu nó là null. Bạn có thể sử dụng CASE()
thay vì.
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>
Chỉnh sửa
Bởi vì trong tên kịch bản của bạn sẽ luôn được điền, bạn sẽ chỉ cần một chỉ mục như sau:
SQL> create unique index blah_uidx on blah
2 (nvl2(email, name, null), email)
3 /
Index created.
SQL>