3

我在 oracle 上有表 Tester,其中包含以下列:

  • 测试者ID
  • 测试者姓名
  • 是默认值
  • 应用程序_ID

TesterID 是主键。现在我希望只能有一个 Default Tester,这意味着只有一个 Tester 可以在 ApplicationID 上拥有 IsDefault =Y 的值。

我尝试了一个约束:

alter table Tester add constraint Tester_ISDEFAULT UNIQUE(IsDefault,Application_ID);

是否可以在 isdefault= Y 的位置创建唯一键?

感谢帮助!

4

4 回答 4

7

没有UNIQUE约束。但是,您可以使用 aUNIQUE INDEX代替:

CREATE UNIQUE INDEX ApplicationId_Default_Y ON tester (
  CASE WHEN IsDefault = 'Y'
       THEN ApplicationId
       ELSE NULL
  END
);

这是一个演示

于 2012-08-29T12:05:17.420 回答
1

您可以使用基于函数的唯一索引来执行此操作,而不是这样的约束:

create unique index tester_isdefault on tester 
  (case when isdefault='Y' then application_id end);

由于 Oracle 不会为全为空的键创建索引条目,因此只有 isdefault='Y' 的行才会出现在索引中。

于 2012-08-29T12:03:21.300 回答
0

该约束不起作用,因为这意味着每个 Application_ID 只能有两行 - 一行 IsDefault=0,另一行 IsDefault=1。

您可以使用触发器强制执行此逻辑。或者,为什么不在您的应用程序逻辑中强制执行它?

于 2012-08-29T12:02:04.693 回答
0

在 tester(decode(is_default, 'Y', 0, tester_id), application_id) 上创建唯一索引 tester_ui_1

于 2012-08-29T12:03:45.997 回答