首页 文章

Oracle SQL设置单个唯一字符

提问于
浏览
0

我在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 回答

  • 1

    您不需要触发器 .
    使用基于表达式的唯一索引:

    CREATE UNIQUE INDEX someindex ON sometable( 
      CASE WHEN DEFAULTRULE = 1
           THEN 1
      END
      );
    

    看这个演示:http://sqlfiddle.com/#!4/2431a
    它允许多个DEFAULTRULE!= 1,但只有一个DEFAULTRULE = 1
    尝试在此演示中附加额外的 INSERT INTO sometable VALUES( 1,1); ,您将收到错误消息 .

相关问题