2014-11-06 4 views
0

У меня возникли проблемы с созданием таблицы в Oracle Oracle.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

Thank you kordirko. Очень ценю помощь и безумно быстрый ответ! Я как раз собирался обновить это после обнаружения: http://dba.stackexchange.com/questions/4815/how-to-implement-a-default-flag-that-can-only-be-set-on- a-single-row Не думал, что любой бы ответил так быстро! Это работает как шарм: D –

Смежные вопросы