1

我有一个非常简单的片段,它已经困扰了我几个小时了:

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))

);

我在这里试图实现的是创建一个约束,如果问题字段包含“看图片”,那么图片不能为 NULL,否则对于每个不包含“看图片”的问题,它可以为 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
4

1 回答 1

3

我认为您只需要一次检查,以防止“查看图片”和 null 的单一组合:

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))

这意味着这两个也都可以:

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);

您甚至可能只想将整个字符串值限制为“查看图片”或几个可能值之一;您也可以使用稍微修改的正则表达式模式来做到这一点。

于 2016-12-29T17:53:21.040 回答