我想我不同意你对触发器试图做什么的描述
做。在我看来,它是为了强制执行这个业务规则:
给定 t1_appnt_event 值,只有一行可以有非 NULL 值
一次 t1_prnt_t1_pk。 (它们在第二列中是否具有相同的值并不重要。)
有趣的是,它是为 UPDATE OF t1_appnt_event 定义的,但不是为其他列定义的,因此我认为有人可以通过更新第二列来破坏规则,除非该列有单独的触发器。
可能有一种方法可以创建一个基于函数的索引来强制执行此规则,以便您可以完全摆脱触发器。我想出了一种方法,但它需要一些假设:
- 该表有一个数字主键
- 主键和 t1_prnt_t1_pk 都始终为正数
如果这些假设成立,您可以创建一个如下所示的函数:
dev> create or replace function f( a number, b number ) return number deterministic as
2 begin
3 if a is null then return 0-b; else return a; end if;
4 end;
和这样的索引:
CREATE UNIQUE INDEX my_index ON my_table
( t1_appnt_event, f( t1_prnt_t1_pk, primary_key_column) );
因此,PMNT 列为 NULL 的行将出现在索引中,并将主键的倒数作为第二个值,因此它们永远不会相互冲突。非 NULL 的行将使用该列的实际(正)值。发生约束冲突的唯一方法是两行的两列中具有相同的非 NULL 值。
这可能过于“聪明”,但它可能会帮助您解决问题。
Paul Tomblin 的更新:我对 igor 在评论中提出的原始想法进行了更新:
CREATE UNIQUE INDEX cappec_ccip_uniq_idx
ON tbl1 (t1_appnt_event,
CASE WHEN t1_prnt_t1_pk IS NOT NULL THEN 1 ELSE t1_pk END);