Así que lo que lo que ha de cumplir una regla que sólo registro no puede ser cancelada por cualquier permutación dada de LOC_ID, fecha, hora? Podemos hacer esto con un índice único basado en función.
Esto es lo que queremos evitar:
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>
Vamos a construir un índice para aplicar la regla
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>
La función NVL2()
es una forma especial de CASE que devuelve el segundo argumento si el El primer argumento NO es NULO sino el tercero. El índice utiliza la columna PK como segundo argumento porque es la clave principal y, por lo tanto, única. Por lo que el índice permite valores duplicados de CANCELADA a menos que sean nulos:
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>
Su ejemplo los datos no dan ninguna base para rechazar la fila con PK = 4 cuando tampoco rechaza la que tiene PK = 2. –
@Jonathan Leffler - Pásame a ello. Tenía la misma pregunta. – Thomas
Sí, PK = 2 está bien. Cancelado puede tener cualquier valor, pero no nulo, repetir dos veces para el mismo locid, fecha y hora. –