次の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を使用しています。
どうですか:
CHECK (status = "Current" or (status = "Complete" and enddate is not null))
CREATE TABLE test (
id integer PRIMARY KEY,
status text NOT NULL CHECK (status IN ('Current', 'Complete')),
enddate date NOT NULL
);
これはSQLiteで動作し、CHECK
制約はインラインで記述されます。 PHPで使用できるように、二重引用符をアポストロフィに変更しました。
単一のテーブルに複数のCHECK
制約があることを妨げるものは何もありません。 IMOは最もシンプルで拡張が容易なソリューションです。
CHECK (status IN ("Current", "Complete"))
CHECK (status <> "Complete" OR enddate IS NOT NULL)
これは、Aの場合はBがAでもBでもないと論理的に同等であることを利用しています。