2012-04-25 3 views
16

Ich habe eine Situation, in der ich eine eindeutige Einschränkung für eine Spalte [Attribut] in Abhängigkeit von einem anderen Spaltenwert erzwingen muss.Bedingte eindeutige Integritätsbedingung in Oracle DB

So zum Beispiel habe ich eine Tabelle wie Tabelle (ID, EID, Name isDeleted)

isDeleted nur einen Wert null oder 'y' (aktiv oder gelöscht) haben kann, und ich will ein erstellen eindeutige Einschränkung für EID, ISDeleted nur wenn ISDeleted = null, da es mir egal ist, wenn es mehrere gelöschte Datensätze mit der gleichen ID gibt. Bitte beachten Sie, dass die EID einen Nullwert haben kann.

Ich verwende Oracle DB dafür.

Antwort

22

Sie können keine Einschränkung erstellen. Sie können jedoch einen eindeutigen funktionsbasierten Index erstellen. Dies nutzt die Tatsache aus, dass Oracle keine NULL-Werte indiziert - alle Zeilen, in denen isDeletedNOT NULL ist, werden nicht in den Index aufgenommen, sodass die eindeutige Integritätsbedingung nicht auf sie zutrifft.

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

Was wird 'sonst null' tun? Wird es einen Nullwert einfügen oder doppelte Datensätze einfügen? – D3V

+0

@SantoshPingale - Da Oracle-Indizes NULL-Werte nicht indizieren, schließt der 'ELSE NULL' diese Zeilen aus dem Index aus, wodurch Duplikate zulässig sind. –