CHECK约束值

问题描述:

我有一个非常简单的一块一直现在窃听我的大脑几个小时: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

我想你只需要一个单一的检查,防止“见图片”和空单组合:

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