2014-11-06 23 views
0

我在Oracle SQL中創建表時遇到問題。Oracle SQL設置單個唯一字符

我正在尋找一個名爲DEFAULTRULE的列。在任何給定時間,此列中只有1行可以是'1'。因此,例如

ID DEFAULTRULE 
1  0 
2  0 
3  1 

如果我是更新ID 2爲具有默認規則= 1條,則這將任一組ID 3默認規則來0

拋出錯誤(我不只要噸真的介意只有一個「1」)

我試圖創建觸發器做到既但不斷收到

ORA-04091表正在變異,觸發器/函數可能看不到它。

2我的嘗試:

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; 

會有人能夠指出我在正確的方向? 在此先感謝。 Jon

回答

1

您不需要觸發器。
使用表達式基於唯一索引:

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

看到這個演示:http://sqlfiddle.com/#!4/2431a
它允許insetring許多DEFAULTRULE = 1,但只有一個DEFAULTRULE = 1次
嘗試在此添加額外的INSERT INTO sometable VALUES(1,1);演示,你會得到一個錯誤。

+0

謝謝kordirko。真的很感謝幫助和瘋狂的快速反應! 我剛剛發現後發現: http://dba.stackexchange.com/questions/4815/how-to-implement-a-default-flag-that-c​​an-only-be-set-on-單排 沒想到有人會這麼快回復! 這就像一個魅力:D – 2014-11-06 17:26:25