2016-12-29 1 views
0

Je possède ce morceau très simple qui a été mise sur écoute mon cerveau pendant quelques heures maintenant:contrainte CHECK pour restreindre les valeurs NULL basée sur une autre colonne valeurs

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

); 

Ce que je suis en train ici atteindre est de créer une contrainte Si le champ de la question contient 'voir l'image' alors l'image ne peut pas être nulle, elle peut être NULL pour chaque question qui ne contient pas 'voir l'image'. J'avais essayé d'autres expressions dans la clause CHECK mais en disponibilité.

Ces inserts fonctionnent très bien:

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) 

Ce ne fonctionne pas:

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

Est-ce que 'question' peut être' null'? Vraisemblablement non, auquel cas vous devriez avoir * cela * comme contrainte (écrire les mots 'NOT NULL' juste après la définition de la colonne). Si * peut * être 'null', la contrainte de vérification devra gérer cette possibilité - et vous devrez partager les besoins de l'entreprise dans ce cas. – mathguy

Répondre

2

Je pense que vous avez seulement besoin d'un seul contrôle, afin d'éviter la combinaison unique de « voir l'image » et 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)) 
); 

Cela ressemble à cette combinaison unique, et vérifie est pas ce que vous avez.

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. 

Comme @vkp suggère, vous pouvez utiliser une expression régulière pour vérifier la partie « voir l'image », pour éviter les faux appariements, et aussi des questions: cas

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

qui signifierait deux ceux-ci sont bien aussi:

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

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

mais ce ne seraient pas autorisés:

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

Vous pouvez même seulement vouloir limiter à la valeur entière de chaîne étant juste «voir l'image», ou une de plusieurs valeurs possibles; que vous pourriez aussi faire avec des motifs regex légèrement modifiés.

+2

peut utiliser 'regexp_like' pour inclure des limites de mots, c'est une meilleure option, donc quelque chose comme' isee pictures' ne correspondra pas. –

+0

Merci Poole pour tout. Je vais prendre la première variante qui est assez bien, la seconde est trop avancée pour moi et je n'en ai pas besoin de toute façon pour mon but. – udarH3