Oracle 唯一约束与表达式

发布于 2024-10-10 23:08:38 字数 371 浏览 3 评论 0原文

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

岁月静好 2024-10-17 23:08:38

也许这给出了一个想法

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

Maybe this gives an idea

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
);

Later:

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');

Last one throws:

ORA-00001: unique constraint (SPEZMDBA.TQ84_N_X) violated
弃爱 2024-10-17 23:08:38

在这种情况下,最简单的方法通常是创建基于函数的索引。类似于

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 和 x 。索引结构中的 y 值(使索引更小)。如果 z 是“N”,则 x 和 z 是“N”。 y 值都存储在索引中,并且索引的行为就像任何其他复合索引一样。

The simplest approach in this case is generally to create a function based index. Something like

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) );

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.

捶死心动 2024-10-17 23:08:38

在这种情况下,我所做的就是在您的情况下创建一个列,例如 Z ,其中包含:

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

然后您可以创建唯一约束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:

  • A particular value (e.g. your "N") in the case I need it to be unique
  • Null otherwise, meaning unknown: two unknown values are considered to be not equal to one another.

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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文