2012-04-25 21 views
16

Başka bir sütun değerine bağlı olarak bir sütun [özniteliği] üzerinde benzersiz bir kısıtlama uygulamak zorunda olduğum bir durum var.Oracle db'de koşullu benzersiz kısıtlama

Bu nedenle, örneğin, bir

isDeleted sadece boş ya da 'y' (aktif veya silinmiş) bir değere sahip olabilir Tablo (İD, bayram, Ad, isDeleted) gibi bir tablo ve bir oluşturmak isteyen EID üzerinde benzersiz kısıtlama, ISDeleted = null olduğunda ISDeleted, aynı kimlikle birden çok silinmiş kayıt varsa umurumda değil. EID'nin boş değerli olabileceğini lütfen unutmayın.

Bunun için Oracle DB kullanıyorum.

cevap

22

Bir kısıt oluşturamazsınız. Ancak benzersiz bir işlev tabanlı dizin oluşturabilirsiniz. Bu, Oracle'ın NULL değerlerini dizine eklememesi avantajından yararlanır - isDeleted'un NOT NULL olduğu satırlar dizine eklenmez, böylece benzersiz kısıtlama onlara uygulanmayacaktır.

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

'null' ne yapacak? Boş bir değer ekler VEYA yinelenen kayıt ekleme izin verir mi? – D3V

+0

@SantoshPingale - Oracle dizinleri NULL değerlerini endekslemediğinden, "ELSE NULL" bu satırları kopyalardan çıkaracak olan dizinden hariç tutulacaktır. –