2016-12-29 103 views
0

我有一個非常簡單的一塊一直現在竊聽我的大腦幾個小時:CHECK約束值

CREATE TABLE driving_school_questions(

    question VARCHAR2(200), 
    picture VARCHAR2(2), 
    CONSTRAINT q_p_chk CHECK ((question LIKE '%see picture%' AND picture IS NOT NULL) 
                AND 
           (question LIKE '% %' OR picture IS NULL)) 

); 

我試圖在這裏實現的是創造一個約束如果問題字段包含「see picture」,那麼圖片不能爲NULL,否則對於每個不包含「see picture」的問題都可以爲NULL。我已經在CHECK子句中嘗試過其他表達式,但是已經有效。

這些插入精細的工作:

INSERT INTO driving_school_questions (question, picture) 
VALUES ('blahblah see picture', '23'); --NOT NULL so ok for now 

INSERT INTO driving_school_questions (question, picture) 
VALUES ('blah blah see picture ', NULL); --It's ok to be NULL(constraint violated) 

這不是工作:

INSERT INTO driving_school_questions (question, picture) 
VALUES ('blah blah', NULL);--it should work but constraint violation 
+1

'問題'可以'空'嗎?大概不會,在這種情況下,你應該把*作爲一個約束(在列定義後面寫下'NOT NULL')。如果它可以是空的,那麼檢查約束將不得不處理這種可能性 - 在這種情況下,您將需要分享業務需求。 – mathguy

回答

2

我想你只需要一個單一的檢查,防止「見圖片」和空單組合:

CREATE TABLE driving_school_questions(
    question VARCHAR2(200), 
    picture VARCHAR2(2), 
    CONSTRAINT q_p_chk CHECK (NOT(question LIKE '%see picture%' AND picture IS NULL)) 
); 

這看起來對於單一組合,並檢查是不是你有什麼。

INSERT INTO driving_school_questions (question, picture) 
VALUES ('blahblah see picture', '23'); 

1 row inserted. 

INSERT INTO driving_school_questions (question, picture) 
VALUES ('blah blah see picture ', NULL); 

Error report - 
ORA-02290: check constraint (SCHEMA.Q_P_CHK) violated 

INSERT INTO driving_school_questions (question, picture) 
VALUES ('blah blah', NULL); 

1 row inserted. 

由於@vkp建議,你可以使用正則表達式來檢查「見圖片」的一部分,以避免錯誤匹配,並且也是區分問題:

CONSTRAINT q_p_chk CHECK (NOT(REGEXP_LIKE(question, '(^|\s)see picture(\s|$)', 'i') 
     AND picture IS NULL)) 

這意味着雙方的這些都OK太:

INSERT INTO driving_school_questions (question, picture) 
VALUES ('blahblah isee pictures', null); 

INSERT INTO driving_school_questions (question, picture) 
VALUES ('See picture', '25'); 

,但這是不允許的:

INSERT INTO driving_school_questions (question, picture) 
VALUES ('See Picture', null); 

您甚至可能只想將整個字符串值限制爲'see picture'或幾個可能的值之一;你也可以用稍微修改的正則表達式來完成。

+2

可能使用'regexp_like'來包含單詞邊界是一個更好的選擇,所以像'isee pictures'這樣的東西將不會匹配。 –

+0

感謝普爾的一切。我會採用第一個變體,這個變體足夠好,第二個變體對我來說太高級了,我不需要它來達到我的目的。 – udarH3