web-dev-qa-db-fra.com

Contrainte de vérification SQLite conditionnelle?

J'ai une table définie par le code SQL suivant:

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

J'aimerais ajouter une contrainte qui requiert que enddate soit non-nul si la status est "Complète".

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

27
Rezzie

Que diriez-vous:

CHECK (status = "Current" or (status = "Complete" and enddate is not null))
41
Andomar
CREATE TABLE test (
  id       integer PRIMARY KEY,
  status   text NOT NULL CHECK (status IN ('Current', 'Complete')),
  enddate  date NOT NULL
);

Cela fonctionnera dans SQLite, avec la contrainte CHECK écrite en ligne. J'ai changé les guillemets doubles en apostrophes pour pouvoir les utiliser en PHP.

5
Ensarija

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

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

Ceci utilise le fait que si A, alors B est logiquement équivalent à soit pas A, ni B .

0
relatively_random