Уникальное ограничение Oracle с выражением - PullRequest
9 голосов
/ 10 января 2011

Поддерживает ли Oracle ограничения с такими выражениями?

Примечание Z = 'N'

ALTER TABLE A ADD CONSTRAINT U_A_KEY UNIQUE(X,Y,Z = 'N');

Возможно ли это Unique constraint?

Пример:

INSERT INTO A VALUES('X','Y','N');  --OK
INSERT INTO A VALUES('X','Y','Y');  --OK
INSERT INTO A VALUES('X','Y','Y');  --OK
INSERT INTO A VALUES('X','Y','N');  --VOLIATION

Ответы [ 3 ]

19 голосов
/ 10 января 2011

Может быть, это дает представление

drop table tq84_n;

create table tq84_n (
   x number, 
   y number, 
   z varchar2(10)
);

create unique index tq84_n_x on tq84_n (
  case when z = 'N' then x || '-' || y 
       else null
  end
);

Позже:

insert into tq84_n values (4,5, 'N');

insert into tq84_n values (9,6, 'Y');
insert into tq84_n values (9,6, 'Y');

insert into tq84_n values (4,5, 'Y');

insert into tq84_n values (4,5, 'N');

Последний бросок:

ORA-00001: unique constraint (SPEZMDBA.TQ84_N_X) violated
6 голосов
/ 10 января 2011

Самый простой подход в этом случае, как правило, заключается в создании индекса на основе функции. Что-то вроде

CREATE UNIQUE INDEX u_a_key
    ON a( (CASE WHEN z = 'N' THEN x ELSE null END),
          (CASE WHEN z = 'N' THEN y ELSE null END) );

Если z не равно 'N', оба оператора CASE оцениваются как NULL, и Oracle не нужно хранить значения x & y в структуре индекса (делая индекс меньше). Если z равно 'N', значения x & y сохраняются в индексе, и индекс ведет себя так же, как и любой другой составной индекс.

0 голосов
/ 10 января 2011

В этом случае я делаю, чтобы создать столбец, например, Z в вашем случае, который имеет:

  • Определенное значение (например, ваше "N") в том случае, если оно мне нужнобыть уникальным
  • В противном случае значение равно нулю, что означает неизвестность: два неизвестных значения считаются не равными друг другу.

Затем вы можете создать свое уникальное ограничение UNIQUE(X,Y,Z).

Добавьте две строки с одинаковыми X и Y и Z = "N", и вы получите ошибку;добавьте две строки с одинаковыми X и Y, оба с Z = null, и вы не будете.

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