我有一个由以下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。
答案 0 :(得分:41)
怎么样:
CHECK (status = "Current" or (status = "Complete" and enddate is not null))
答案 1 :(得分:4)
CREATE TABLE test (
id integer PRIMARY KEY,
status text NOT NULL CHECK (status IN ('Current', 'Complete')),
enddate date NOT NULL
);
这将在SQLite中起作用,内联写入CHECK
约束。我将双引号更改为撇号,因此可以在PHP中使用。
答案 2 :(得分:0)
没有什么可以阻止您在单个表上拥有多个CHECK
约束。 IMO是最简单,最容易扩展的解决方案:
CHECK (status IN ("Current", "Complete"))
CHECK (status <> "Complete" OR enddate IS NOT NULL)
这使用如果A然后B 在逻辑上等同于不是A或B 的事实。