Oracle уникальное ограничение с предложением где - PullRequest
3 голосов
/ 22 июня 2009

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

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

Есть мысли о том, как это сделать?

Ура, Mark

Ответы [ 2 ]

6 голосов
/ 22 июня 2009

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

4 голосов
/ 22 июня 2009

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

Пример:

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.

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

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.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...