2010-04-10 4 views
23

J'ai une table définie par l'instruction SQL suivante:Contrainte de vérification SQLite conditionnelle?

CREATE TABLE test (
    id  integer PRIMARY KEY NOT NULL UNIQUE, 
    status text NOT NULL, 
    enddate date, 
    /* Checks */ 
    CHECK (status IN ("Current", "Complete")) 
); 

Je voudrais ajouter une contrainte qui nécessite enddate être non nulle si lestatus est « complète ».

Est-ce possible? J'utilise SQLite v3.6.16.

Répondre

35

Que diriez-vous:

CHECK (status = "Current" or (status = "Complete" and enddate is not null)) 
+2

Merci, cela fonctionne. Est-ce le seul moyen? À l'avenir, je pourrais avoir un plus grand nombre de statuts et le chèque pourrait devenir assez important. – Rezzie

+4

Lorsque les contraintes deviennent très complexes, l'approche consiste généralement à placer une couche devant la table pour l'appliquer. Comme une couche de procédure stockée ou une bibliothèque d'accès aux données. – Andomar

+0

Merci pour le conseil. – Rezzie

5
CREATE TABLE test (
    id  integer PRIMARY KEY, 
    status text NOT NULL CHECK (status IN ('Current', 'Complete')), 
    enddate date NOT NULL 
); 

Cela fonctionne dans SQLite, avec la ligne écrite de contrainte CHECK. J'ai changé les guillemets doubles en apostrophes donc ça peut être utilisé en PHP.

+0

Avez-vous lu la question? Il a même mis le rôle important dans ** bold ** ce que vous venez de rejeter. – TWiStErRob

0

Rien ne vous empêche d'avoir plusieurs contraintes CHECK sur une seule table. OMI, la solution la plus simple et le plus facilement extensible:

CHECK (status IN ("Current", "Complete")) 
CHECK (status <> "Complete" OR enddate IS NOT NULL) 

Il utilise le fait que si A alors B est logiquement équivalent à soit non A ou B.

Questions connexes