2016-12-16 161 views
2

我想知道這個條件是否可以通過檢查約束來完成,還是我需要創建一個觸發器。檢查約束的條件

條件:如果學生承認當年日期不是null,則考試標記爲空

備註:Constaint情況或觸發

我的嘗試:

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中,兩列是這樣的(dateadmited 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);