根据列的值限制表可以包含的行数 - SQLite

时间:2017-10-16 18:10:10

标签: sqlite

由于SQLite不支持TRUE和FALSE,我有一个存储0和1的布尔关键字。对于有问题的布尔列,我希望检查1的数量是什么列包含并限制表的总数。

例如,表可以包含列:name,isAdult。如果表中有超过5个成员,系统将不允许用户添加isAdult = 1的第6个条目。对表可以包含的行数没有限制,因为对数量没有限制其中isAdult = 0。

2 个答案:

答案 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,因此您可能是唯一的用户。