2012-10-24 7 views
8

Hier ist der Probentisch mit 3 Spalten (ID, UNIQUE_VALUE, UNIQUE_GROUP_ID)Wie erstellt man einen eindeutigen Index für Felder mit möglichen Nullwerten (Oracle 11g)?

ich unter Aufzeichnungen wollen zugelassen werden kann:

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

oder

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

oder (Hinweis: Diese Bedingung ist nicht erlaubt in unique index noch unique constraint)

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

und diese können nicht zulässig:

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

ich einen eindeutigen Index für den letzten zwei Spalten erstellt, aber nur die ersten zwei Beispiele erlaubt werden kann.

Ist es möglich, Db die Eindeutigkeit dieser 2 Spalten nur dann überprüfen lassen, wenn beide nicht null sind?

+0

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

Antwort

19

Sie möchten nur die Eindeutigkeit für die Zeilen erzwingen, bei denen UNIQUE_VALUE und UNIQUE_GROUP_ID nicht null sind. Um dies zu tun, können Sie eine einzigartige Funktion basierten Index verwenden:

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

können Sie die Funktion NVL verwenden, um NULL-Werte zu vermeiden und setzen Sie einen anderen Wert stattdessen

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

der Nachteil ist, dass Ihr Index wird größer sein und wenn Sie nach Null-Werten suchen möchten, müssen Sie die nvl-Funktion verwenden, um table_access_full zu vermeiden.

Außerdem befinden sich alle Nullwerte unter einer Verzweigung im Index. Stellen Sie daher sicher, dass Ihre Histogramme aktualisiert werden.

Ich hoffe, dies wird Ihnen helfen :)

+1

Dies entspricht nicht der Eindeutigkeitsanforderung. Mehrere Nullen würden zusammenstoßen. – Vadzim

Verwandte Themen