将数据约束写入表中

时间:2012-09-05 18:33:42

标签: sql oracle triggers

我想在表中添加一些东西(触发器?),这样,确切地说,每个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提供了什么样的工具来创建这样的约束?

2 个答案:

答案 0 :(得分:2)

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

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

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

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

答案 1 :(得分:-1)

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

ALTER TABLE table_name add CONSTRAINT constraint_name UNIQUE (ID,Current);