带表达式的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
答
也许这给出了一个想法
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的行,你不会。
这是否意味着对于每个x,y组合,这意味着您最多只需要一个Z ='N'的记录? – 2011-01-10 15:30:36
是的,这是正确的。 – JamesC 2011-01-10 15:33:19