Oracle SQL устанавливает один уникальный символ

У меня возникли проблемы с созданием таблицы в Oracle SQL.

Я искал столбец под названием DEFAULTRULE. Только 1 строка в этом столбце может быть «1» в любой момент времени. Так например

ID    DEFAULTRULE
1     0
2     0
3     1

Если бы я обновил ID 2, чтобы иметь правило по умолчанию = 1, то он либо установил бы правило ID 3 по умолчанию на 0

or

выдать ошибку (я не возражаю, если есть только одна «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;

Кто-нибудь сможет указать мне правильное направление? Заранее спасибо. Джон


person Ghojzilla    schedule 06.11.2014    source источник


Ответы (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); в этой демонстрации, и вы получите ошибку.

person krokodilko    schedule 06.11.2014
comment
Спасибо кордирко. Очень ценю помощь и безумно быстрый ответ! Я как раз собирался обновить это, обнаружив: dba.stackexchange.com/questions/4815/ Не думал, что кто-то ответь так быстро! Это работает как шарм :D - person Ghojzilla; 06.11.2014