2009-06-21 4 views
2

У меня есть таблица базы данных Oracle, на которую я хочу применить уникальное ограничение. Проблема в том, что я только хочу применить ограничение, если столбец в этой таблице равен нулю,Oracle уникальное ограничение с предложением where

т.е. если в строке нет столбца deleted_date, примените ограничение, иначе проигнорируйте его. Это позволит мягко удалять записи и игнорировать ограничения на них.

Любые мысли о том, как это сделать?

Cheers, Марк

ответ

6

Просто создать несколько столбцов ограничение а - столбец, который вы хотите быть уникальным плюс дата удаления. Все не удаленные строки будут иметь уникальное значение и дату удаления null. Все удаленные строки будут уникальными из-за даты удаления (при условии, что это отметка времени, и разрешение достаточно для разделения всех удалений). Если удаленные строки не могут быть разделены датой удаления, можно подумать о создании нового столбца и добавлении его к ограничению, чтобы идентифицировать дату удаления, но это было бы довольно неэлегантным решением.

+0

человек, я пытался задуматься об этом! Спасибо, это будет прекрасно. Я думаю, – Mark

4

И если разрешение недостаточно, то вы можете создать уникальный индекс, основанный на функциях.

Пример:

SQL> create table t (id,col,deleted_date) 
    2 as 
    3 select 1, 99, null from dual union all 
    4 select 2, 99, date '2009-06-22' from dual 
    5/

Tabel is aangemaakt. 

SQL> alter table t add constraint t_pk primary key (id) 
    2/

Tabel is gewijzigd. 

SQL> alter table t add constraint t_uk1 unique (col,deleted_date) 
    2/

Tabel is gewijzigd. 

Это решение описывается Daniel. Если когда-либо вероятность того, что две строки будут удалены в то же самое время (я использую только часть даты здесь), это решение не является достаточно хорошим:

SQL> insert into t values (3, 99, date '2009-06-22') 
    2/
insert into t values (3, 99, date '2009-06-22') 
* 
FOUT in regel 1: 
.ORA-00001: unique constraint (RWK.T_UK1) violated 

В этом случае используют уникальную функцию, основанную индекс:

SQL> alter table t drop constraint t_uk1 
    2/

Tabel is gewijzigd. 

SQL> create unique index i1 on t (nvl2(deleted_date,null,col)) 
    2/

Index is aangemaakt. 

SQL> insert into t values (3, 99, date '2009-06-22') 
    2/

1 rij is aangemaakt. 

С уважением, Роб.

+0

+1: уникальный индекс, основанный на функциях, вероятно, лучше, чем принятый в настоящее время ответ –

Смежные вопросы