由于SQLite不支持TRUE和FALSE,我有一个存储0和1的布尔关键字。对于有问题的布尔列,我希望检查1的数量是什么列包含并限制表的总数。
例如,表可以包含列:name,isAdult。如果表中有超过5个成员,系统将不允许用户添加isAdult = 1的第6个条目。对表可以包含的行数没有限制,因为对数量没有限制其中isAdult = 0。
答案 0 :(得分:1)
您可以使用触发器来阻止插入第六个条目:
CREATE TRIGGER five_adults
BEFORE INSERT ON MyTable
WHEN NEW.isAdult
AND (SELECT COUNT(*)
FROM MyTable
WHERE isAdult
) >= 5
BEGIN
SELECT RAISE(FAIL, "only five adults allowed");
END;
(您可能需要UPDATE类似的触发器。)
答案 1 :(得分:0)
SQL-99标准将使用ASSERTION
来解决这个问题 - 一种约束类型可以验证与任意SELECT语句相关的数据更改。不幸的是,目前市场上没有SQL数据库实现ASSERTION
约束。它是SQL标准的可选功能,没有实现者优先考虑它。
解决方法是创建外键约束,因此isAdult可以是引用仅包含值1到5的查找表的整数值。然后还在isAdult上放置UNIQUE约束。当行是针对非成人的用户时,使用NULL表示“false”(UNIQUE忽略NULL)。
另一种解决方法是在应用程序代码中执行此操作。在更改之前从数据库中进行选择,以确保您的更改不会破坏应用程序的业务规则。通常在多用户RDMS中,由于竞争条件,这是不可能的,但由于您使用的是SQLite,因此您可能是唯一的用户。