Oracle 唯一约束与表达式
Oracle 是否支持这样的表达式约束?
注意 Z = 'N'
ALTER TABLE A ADD CONSTRAINT U_A_KEY UNIQUE(X,Y,Z = 'N');
这个唯一约束
可能吗?
例子:
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
Does Oracle
support constraints with expressions like so?
Notice Z = 'N'
ALTER TABLE A ADD CONSTRAINT U_A_KEY UNIQUE(X,Y,Z = 'N');
Is this Unique constraint
possible?
Example:
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
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
也许这给出了一个想法
稍后:
最后一个抛出:
Maybe this gives an idea
Later:
Last one throws:
在这种情况下,最简单的方法通常是创建基于函数的索引。类似于
如果 z 不是“N”,则两个 CASE 语句的计算结果均为 NULL,并且 Oracle 不必存储 x 和 x 。索引结构中的 y 值(使索引更小)。如果 z 是“N”,则 x 和 z 是“N”。 y 值都存储在索引中,并且索引的行为就像任何其他复合索引一样。
The simplest approach in this case is generally to create a function based index. Something like
If z is not 'N', both CASE statements evaluate to NULL and Oracle doesn't have to store the x & y values in the index structure (making the index smaller). If z is 'N', the x & y values are both stored in the index and the index behaves just like any other compound index.
在这种情况下,我所做的就是在您的情况下创建一个列,例如
Z
,其中包含:然后您可以创建唯一约束
UNIQUE(X,Y,Z)
。添加 X 和 Y 相等且 Z="N" 的两行,您将收到错误;添加 X 和 Y 相等且 Z=null 的两行,但您不会。
What I do in that sitaution is to create a column e.g.
Z
in your case, which has:Then you can create your unique constraint
UNIQUE(X,Y,Z)
.Add two rows with equal X and Y and Z="N" and you'll get an error; add two rows with equal X and Y both with Z=null and you won't.