我想在表中添加一些东西(触发器?),这样,确切地说,每个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;
我有两个问题:
将这种约束逻辑编码到表中是一个好主意,还是最好为操作数据的应用程序保存?为什么呢?
怎么办? oracle提供了什么样的工具来创建这样的约束?
答案 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);