2012-04-25 13 views
16

Ho una situazione in cui è necessario applicare un vincolo univoco su una colonna [attributo] in base a un altro valore di colonna.Vincolo univoco condizionale in oracle db

Così, per esempio, ho una tabella come tabella (ID, EID, Nome, isDeleted)

isDeleted può avere solo un valore nullo o 'y' (attivo o eliminato), e voglio creare un vincolo univoco su EID, ISDeleted solo quando ISDeleted = null, dal momento che non mi interessa se ci sono più record eliminati con lo stesso id. Si noti che l'EID può avere valore nullo.

Sto utilizzando Oracle DB per questo.

risposta

22

Non è possibile creare un vincolo. Ma puoi creare un indice univoco basato sulle funzioni. Ciò si avvantaggia del fatto che Oracle non indicizza i valori NULL: tutte le righe in cui 012 non sono incluse nell'indice NOT NULL, pertanto il vincolo univoco non verrà applicato a tali valori.

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

Cosa farà "else null"? Inserirà un valore nullo OPPURE consentirà l'inserimento di record duplicati? – D3V

+0

@SantoshPingale - Dal momento che gli indici Oracle non indicizzano i valori NULL, il 'ELSE NULL' escluderà quelle righe dall'indice che consentirà duplicati. –

Problemi correlati