我在oracle SQL中创建表时遇到问题 .
我希望有一个名为DEFAULTRULE的专栏 . 在任何给定时间,此列中只有1行可以为“1” . 所以举个例子
ID DEFAULTRULE
1 0
2 0
3 1
如果我要更新ID 2以使默认规则= 1,那么它将ID 3默认规则设置为0
要么
抛出一个错误(我不介意,只要只有一个'1')
我试图创建触发器来做到这两点,但继续得到
ORA-04091表正在变异,触发/功能可能看不到它 .
我的两次尝试:
CREATE OR REPLACE TRIGGER CHECKDEFAULTRULE
BEFORE UPDATE ON BUSINESS_RULE
FOR EACH ROW
DECLARE
v_count NUMBER(1);
BEGIN
IF :NEW.DEFAULTRULE = 1 THEN
SELECT COUNT(DEFAULTRULE)INTO v_count FROM BUSINESS_RULE WHERE DEFAULTRULE = 1;
IF v_count != 0 THEN
RAISE_APPLICATION_ERROR(-20000,'BUSINESS_RULE already has a default rule. Please set this to 0 and try again');
END IF;
END IF;
END;
和
CREATE OR REPLACE TRIGGER CHECKDEFAULTRULE
BEFORE UPDATE ON BUSINESS_RULE
FOR EACH ROW
BEGIN
IF :new.DEFAULTRULE = 1 THEN
UPDATE BUSINESS_RULE
SET DEFAULTRULE = 0;
WHERE DEFAULTRULE = 1;
END IF;
END checkDefaultForOne;
有人能指出我正确的方向吗?提前致谢 . 乔恩
1 回答
您不需要触发器 .
使用基于表达式的唯一索引:
看这个演示:http://sqlfiddle.com/#!4/2431a
它允许多个DEFAULTRULE!= 1,但只有一个DEFAULTRULE = 1
尝试在此演示中附加额外的
INSERT INTO sometable VALUES( 1,1);
,您将收到错误消息 .