您希望实施一条规则,即在任何给定的LOC_ID、DATE、TIME排列组合下,只有记录不能被取消。我们可以通过一个基于函数的唯一索引来实现这一点。
这就是我们想要避免的情况:
SQL> select * from t34
2 /
PK LOC_ID SOMEDATE SOMETIM CAN
1 1 01/01/2010 10:00AM YES
2 1 01/01/2010 10:00AM YES
3 1 01/01/2010 10:00AM
SQL> insert into t34
2 values (4 , 1 , to_date('01/01/2010','DD/MM/YYYY') , '10:00AM', null )
3 /
1 row created.
SQL>
让我们建立一个索引来执行规则
SQL> rollback
2 /
Rollback complete.
SQL> create unique index t34_uidx
2 on t34 (loc_id, somedate, some_time, nvl2(cancelled, pk, null) )
3 /
Index created.
SQL>
NVL2()
函数是CASE的一种特殊形式,如果第一个参数不为NULL,则返回第二个参数,否则返回第三个参数。索引使用PK列作为第二个参数,因为它是主键,因此唯一。因此,该索引允许CANCELLED的重复值,除非它们为null:
SQL> insert into t34
2 values (4 , 1 , to_date('01/01/2010','DD/MM/YYYY') , '10:00AM', null )
3 /
insert into t34 values (4 , 1 , to_date('01/01/2010','DD/MM/YYYY') , '10:00AM', null )
*
ERROR at line 1:
ORA-00001: unique constraint (APC.T34_UIDX) violated
SQL>