2

我想向表中添加一些内容(触发器?),以便确切地说,每个 ID 恰好有 1 行具有特定列的特定值。因此,如果运行了一条使情况并非如此的语句,则会引发异常并回滚插入。

让我们采用这个模式。

ID    Current    Value
1     Y          0
1     N          0
1     N          2
2     Y          2

我想要的约束是,对于每个 ID,只有一行的电流为“Y”。

因此,这些语句将不会被执行并返回适当的错误:

insert into table values (1,'Y',1);
insert into table values (3,'N',2);
update table set current = 'N' where ID = 1;

我有两个问题:

  1. 将这种约束逻辑编码到您的表中是一个好主意,还是最好为处理数据的应用程序保存?为什么?

  2. 如何做呢?oracle 提供了什么样的工具来创建这样的约束?

4

2 回答 2

2

最好以声明方式指定它(而不是在程序上,例如使用触发器)。特别是因为没有某种锁定算法的触发器,由于并发会话试图同时插入/更新表,所以无论如何都不会工作。

在这种情况下,最简单的解决方案是唯一的、基于函数的索引,例如:

CREATE UNIQUE INDEX only_one_current ON thetable
  (CASE WHEN Current = 'Y' THEN ID END);

如果 Current = 'N',则表达式为 NULL,并且不存储索引中的全 NULL 行,这意味着唯一性约束将仅适用于 Current = 'Y' 的行。

于 2012-09-06T04:49:46.850 回答
-1

我认为您正在寻找的只是一个独特的约束。您可以使用以下语句添加它,以便只有 ID 和 Current 的唯一组合可以存在于表中。

ALTER TABLE table_name add CONSTRAINT constraint_name UNIQUE (ID,Current);
于 2012-09-05T22:22:30.193 回答