web-dev-qa-db-ja.com

条件付きSQLiteチェック制約?

次のSQLで定義されたテーブルがあります。

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

enddateがnull以外であることを要求する制約を追加したいifstatusは「完全」です。

これは可能ですか? SQLite v3.6.16を使用しています。

31
Rezzie

どうですか:

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

これはSQLiteで動作し、CHECK制約はインラインで記述されます。 PHPで使用できるように、二重引用符をアポストロフィに変更しました。

4
Ensarija

単一のテーブルに複数のCHECK制約があることを妨げるものは何もありません。 IMOは最もシンプルで拡張が容易なソリューションです。

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

これは、Aの場合はBAでもBでもないと論理的に同等であることを利用しています。

0