2016-12-16 2 views
2

Мне интересно, можно ли это условие выполнить с помощью ограничения проверки или мне нужно создать триггер.Проверить ограничение с условием

Состояние: если студент admited дата не нулевой, то знак экзамен является недействительным

Примечание: Constaint случай ИЛИ Trigger

Что я пробовал:

ALTER TABLE ADMITED_TABLE 
ADD CONSTRAINT AAAA CHECK 
(CASE WHEN DATEADMITED IS NOT NULL THEN MARK NULL END); 

Ошибка:

ORA-00920: invalid relational operator 
00920. 00000 - "invalid relational operator" 
+1

правлю недостающее конца –

ответ

2

А проверочные ограничения принимает логическое состояние, так что вы должны были бы обрамляют эту логику в виде такого условия:

ALTER TABLE ADMITED_TABLE 
ADD CONSTRAINT AAAA CHECK 
(dateadmited IS NULL OR mark IS NULL); 
+0

Это возвращает ошибку: не может проверить (SYSTEM.AAAA) - нарушение проверки нарушено –

+0

@DavidEdgar Это означает, что у вас есть данные, которые не соответствуют требованию. Вы должны либо исправить это, либо объявить ограничение как первоначально отложенное. – Mureinik

+0

В моей таблице ADMITED_TABLE два столбца похожи на это (дата DATE, MARK INTEGER). При создании таблицы нет NOT NULL ИЛИ NULL. –

1

Из описания в вопросе появляется то, что вы хотите это триггер, а не ограничение. Ограничение позволяет проверить, что значения в таблице соответствуют вашим ожиданиям; однако ограничение не может изменить значение столбца. Поэтому, если вы просто пытаетесь проверить, что приведенные значения соответствуют вашим правилам, ограничение CHECK достаточно. Если вы хотите (потенциально) изменить значение столбца MARK вам нужно использовать триггер, например:

CREATE OR REPLACE ADMITED_TABLE_BIU 
    BEFORE INSERT OR UPDATE ON ADMITED_TABLE 
    FOR EACH ROW 
BEGIN 
    IF :NEW.DATEADMITED IS NOT NULL THEN 
    :NEW.MARK := NULL; 
    END IF; 
END ADMITED_TABLE_BIU; 

Лучший удачи.

2

Я должен быть неправильное требование Давида, потому что мое решение:

ALTER TABLE admitted_table 
    ADD CONSTRAINT aaaa CHECK 
      ((dateadmitted IS NOT NULL 
      AND mark IS NULL) 
      OR dateadmitted IS NULL); 

Ниже приведены мои тестовые примеры:

-- Succeeds 
INSERT INTO admitted_table (
      dateadmitted, mark 
      ) 
    VALUES (SYSDATE, NULL); 

-- Fails due to check constraint 
INSERT INTO admitted_table (
      dateadmitted, mark 
      ) 
    VALUES (SYSDATE, 10); 

-- Succeeds 
INSERT INTO admitted_table (
      dateadmitted, mark 
      ) 
    VALUES (NULL, 99); 
Смежные вопросы