2012-10-24 19 views
8

Ecco la tabella di esempio con 3 colonne (ID, UNIQUE_VALUE, UNIQUE_GROUP_ID)Come creare indici univoci su campi con possibili valori nulli (Oracle 11g)?

voglio qui sotto record può essere consentito:

(1, NULL, NULL) 
(2, NULL, NULL) 

o

(3, NULL, 7) 
(4, 123, 7) 

o (Nota: questo condizione non è consentita in unique indexunique constraint)

(5, NULL, 7) 
(6, NULL, 7) 

e questi non possono essere ammessi:

(7, 123, 7) 
(8, 123, 7) 

ho creato un indice univoco ultime 2 colonne, ma solo i primi 2 esempi possono essere ammessi.

È possibile consentire a db di controllare l'univocità di queste 2 colonne solo quando entrambe non sono nulle?

+0

Dup di http://stackoverflow.com/questions/1374737/how-can-i-create-a-unique-index-in-oracle-but-ignore -nulls – Vadzim

risposta

19

Si desidera applicare l'univocità solo sulle righe in cui sia UNIQUE_VALUE sia UNIQUE_GROUP_ID non sono nulli. Per fare questo, è possibile utilizzare una funzione di unico basato index:

CREATE UNIQUE INDEX func_based_index ON the_table 
    (CASE WHEN unique_value IS NOT NULL 
     AND unique_group_id IS NOT NULL 
     THEN UNIQUE_VALUE || ',' || UNIQUE_GROUP_ID 
    END); 
-2

è possibile utilizzare la funzione NVL per evitare i valori nulli e mettere un valore diverso, invece,

create unique index func_idx on TEST_TABLE (nvl(UNIQUE_VALUE,1), UNIQUE_GROUP_ID); 

lo svantaggio è che l'indice sarà più grande e se vuoi cercare valori nulli dovrai usare la funzione nvl per evitare table_access_full.

anche tutti i valori nulli si troveranno sotto un ramo nell'indice, quindi assicurarsi che gli istogrammi siano aggiornati.

Spero che questo vi aiuterà a :)

+1

Questo non riguarda il requisito di unicità. Diversi valori nulli si scontreranno. – Vadzim