2012-04-25 25 views
16

Tengo una situación en la que necesito imponer una restricción única en una columna [atributo] dependiendo de otro valor de columna.Restricción condicional única en Oracle db

Así, por ejemplo, tengo una tabla como la tabla (ID, EID, Nombre, isDeleted)

isDeleted sólo puede tener un valor nulo o 'y' (activa o eliminado), y quiero crear una restricción única en EID, ISDeleted solo cuando ISDeleted = null, ya que no me importa si hay múltiples registros eliminados con el mismo id. Tenga en cuenta que EID puede tener un valor nulo.

Estoy usando Oracle DB para esto.

Respuesta

22

No puede crear una restricción. Pero puede crear un índice único basado en funciones. Esto aprovecha el hecho de que Oracle no indexa valores NULOS: cualquier fila donde isDeleted es NOT NULL no se incluirá en el índice, por lo que la restricción única no se aplicará a ellos.

CREATE UNIQUE INDEX one_not_deleted 
    ON table_name((CASE WHEN isDeleted IS NULL 
         THEN eid 
         ELSE null 
         END)); 
+0

¿Qué 'else null' do? ¿Insertará un valor nulo O permitirá la inserción de registros duplicados? – D3V

+0

@SantoshPingale - Dado que los índices de Oracle no indexan valores NULL, el 'ELSE NULL' excluirá aquellas filas del índice que permitirán duplicados. –

Cuestiones relacionadas