【发布时间】:2019-08-06 20:56:58
【问题描述】:
我有一种情况,我需要有条件地为两列(FK_1、NAME)维护一个唯一约束。该约束不应应用于第二个外键相同 (FK_2) 的行。
ID FK_1 FK_2 NAME
1 2 3 'X01'
2 2 3 'X01-A'
3 2 3 'X01' --Accepted
4 2 4 'X01' --Violation
5 3 5 'X01' --Accepted
我想要完成的是第 1、2 和 3 行是有效的,因为 FK_2 是相同的。它们打破了唯一约束,但唯一约束被忽略,因为 FK_2 是相同的。第 4 行将违反 (FK_1,NAME) 的唯一约束,因为 FK_2 将是新的。最后,由于 (FK_1,NAME) 上的唯一约束的正常功能,第 5 行很好。
它正在尝试确定如何处理复杂的第 3 行。
当 FK_2 的等价物在某种程度上被硬编码 (Oracle: function based index selective uniqueness) 时,我已经看到了几个如何解决同样问题的示例,但我不确定如何为外键解决这个问题,我真的无法控制 FK_2 的值。
我尝试实现基于函数的唯一索引,但它导致 ORA-04091 异常。
CREATE OR REPLACE FUNCTION UNQ_TEST_FUNCTION(var_fk_1 IN NUMBER, var_fk_2 IN NUMBER, var_name IN VARCHAR2) RETURN NUMBER DETERMINISTIC IS
result NUMBER;
BEGIN
result := null;
IF (var_fk_1 IS NULL OR var_fk_2 IS NULL OR var_name IS NULL ) THEN
result := null;
ELSE
SELECT COUNT(ID) INTO result FROM TEST1 WHERE
FK_2 != var_fk_2 AND FK_1 = var_fk_1 AND NAME = var_name;
IF (result <= 0) THEN
result := null;
ELSE
result := 1;
END IF;
END IF;
RETURN result;
END;
CREATE UNIQUE INDEX UNQ_TEST ON TEST1
(
UNQ_TEST_FUNCTION("FK_1","FK_2","NAME")
)
;
INSERT INTO TEST1 (ID, FK_1, FK_2, NAME)
VALUES (1, 2, 3, 'X01');
ORA-04091: table TEST1 is mutating, trigger/function may not see it
这个异常很合理,但是无法查询表让我不知去向。
【问题讨论】:
-
您的数据模型有问题。我觉得它缺少某种实体。
-
好吧,这不是我真正的数据模型。我只想包括我认为相关的内容。哪一部分看起来不对?
标签: sql oracle conditional unique-constraint