Условное ограничение проверки SQLite? - PullRequest
28 голосов
/ 11 апреля 2010

У меня есть таблица, определяемая следующим SQL:

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

Я хотел бы добавить ограничение, которое требует, чтобы enddate было ненулевым , если , то status имеет значение "Завершено".

Возможно ли это? Я использую SQLite v3.6.16.

Ответы [ 3 ]

41 голосов
/ 11 апреля 2010

Как насчет:

CHECK (status = "Current" or (status = "Complete" and enddate is not null))
4 голосов
/ 18 апреля 2012
CREATE TABLE test (
  id       integer PRIMARY KEY,
  status   text NOT NULL CHECK (status IN ('Current', 'Complete')),
  enddate  date NOT NULL
);

Это будет работать в SQLite с ограничением CHECK, записанным внутри строки. Я изменил двойные кавычки на апострофы, чтобы их можно было использовать в PHP.

0 голосов
/ 11 декабря 2017

Ничто не мешает вам иметь несколько CHECK ограничений для одной таблицы.ИМО самое простое и наиболее легко расширяемое решение:

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

При этом используется тот факт, что если A, то B логически эквивалентно , либо не A, либо B .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...