带表达式的Oracle唯一约束

问题描述:

Oracle是否支持表达式这样的约束?带表达式的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 
+0

这是否意味着对于每个x,y组合,这意味着您最多只需要一个Z ='N'的记录? – 2011-01-10 15:30:36

+0

是的,这是正确的。 – JamesC 2011-01-10 15:33:19

也许这给出了一个想法

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 
+0

满足用例,感谢您的建议。 – JamesC 2011-01-10 16:00:09

在这种情况下最简单的办法通常为创建一个函数的索引。像

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',则y值都存储在索引中,并且索引与其他任何复合索引一样。

我在sitaution做的是例如创建一个列Z你的情况,其中有:

  • 一个特定值(例如,您的“N”)的情况下,我需要它是唯一
  • 空,否则,意思是未知的:两个未知值被认为是不彼此相等。

然后,您可以创建您的唯一约束UNIQUE(X,Y,Z)

添加等于X和Y且Z =“N”的两行,您将看到一个错误;用Z = null添加两个等于X和Y的行,你不会。