2011-07-15 14 views
7

Tengo que mantener el historial, por lo que estoy usando la columna is_deleted que puede tener 'Y' o 'N'. Pero para cualquier instancia de is_deleted 'N' debería haber ingresado uniwue para columnas compuestas (a, b, c).Oráculo: singularidad selectiva del índice basado en función

Cuando intento crear un índice único basado en función, recibo un error.

CREATE UNIQUE INDEX fn_unique_idx ON table1 (CASE WHEN is_deleted='N' then (id, name, type) end); 

ERROR en la línea 1: ORA-00907 : falta paréntesis derecho

por favor ayuda.

Gracias

Respuesta

13

usted necesitaría algo así como

CREATE UNIQUE INDEX fn_unique_idx 
    ON table1 (CASE WHEN is_deleted='N' THEN id ELSE null END, 
       CASE WHEN is_deleted='N' THEN name ELSE null END, 
       CASE WHEN is_deleted='N' THEN type ELSE null END); 

Un ejemplo de la restricción en la acción

SQL> create table table1 (
    2 id number, 
    3 name varchar2(10), 
    4 type varchar2(10), 
    5 is_deleted varchar2(1) 
    6 ); 

Table created. 

SQL> CREATE UNIQUE INDEX fn_unique_idx 
    2  ON table1 (CASE WHEN is_deleted='N' THEN id ELSE null END, 
    3     CASE WHEN is_deleted='N' THEN name ELSE null END, 
    4     CASE WHEN is_deleted='N' THEN type ELSE null END); 

Index created. 

SQL> insert into table1 values(1, 'Foo', 'Bar', 'N'); 

1 row created. 

SQL> insert into table1 values(1, 'Foo', 'Bar', 'Y'); 

1 row created. 

SQL> insert into table1 values(1, 'Foo', 'Bar', 'Y'); 

1 row created. 

SQL> insert into table1 values(1, 'Foo', 'Bar', 'N'); 
insert into table1 values(1, 'Foo', 'Bar', 'N') 
* 
ERROR at line 1: 
ORA-00001: unique constraint (SCOTT.FN_UNIQUE_IDX) violated 


SQL> insert into table1 values(1, 'Foo', 'Zee', 'N'); 

1 row created. 
+0

Pero mi caso de uso es cuando is_deleted = 'N', entonces combinación de (id, nombre, tipo) - la clave compuesta debe ser única. ¿Su consulta logrará lo mismo? –

+0

@Andriod_enthusiast - Parece que sí. Actualicé mi respuesta con la prueba que ejecuté. –

+0

muchas gracias. lo aprecio. Entonces, si no tengo conspiración nula en estas columnas, creo que puedo omitir ELSE nulo –

Cuestiones relacionadas