SQL强制限制数据库的最多N项容量

时间:2013-05-17 08:17:24

标签: sql sqlite

我有一个数据库,我们缓存各种数据,但它不应该变得太大,所以我需要限制它拥有的相同类型的项目数量,之后它应该拒绝新项目。

作为简化示例,如果数据库有2列 - COUNTRYCITY,则“加拿大”不超过100个城市,“美国”不超过100个城市。如果我已经有来自“加拿大”的70个城市并且想要再添加35个城市,我应该只添加30个,然后停止接受数据库中“加拿大”的新城市。

现在我正在考虑每次添加项目并以这种方式执行策略时使用SELECT COUNT (*) WHERE COUNTRY=?查询数据库。

有更好的解决方案吗?

3 个答案:

答案 0 :(得分:2)

我想到了几种解决方案。您似乎的目标是保留前N个条目,并且选择计数(*)其中country ..可能是解决此问题的方法。您可以为加拿大的每个条目分配计数器(1,2,3 - ),但这会导致严格的数据批量。 在MSSQL上你可以创建一个"而不是"类型的触发器,根据计数计算出现次数和接受/拒绝。您可以接受所有输入,将其存储在数据表中,并仅根据查询或具有此查询的视图显示前100个。

Ketil

答案 1 :(得分:1)

因为世界上只有大约200个国家/地区,如果您为每个国家/地区添加100个城市,这将为您提供20.000条记录,这不是很多,您也可以使用COUNT(*)来查看是否可以添加更多的城市,但如果你想为每个国家增加100多个城市,你的解决方案将无法很好地扩展(需要更多时间,具体取决于城市/国家的数量,以及表格中是否有其他列等。 )

如果您想扩展到每个国家/地区的更多城市,您可以创建一个中间表,您可以在其中存储每个国家/地区的城市数量,并在向某个国家/地区添加城市时更新该表中的字段。

此外,您可以为一个国家/地区添加已添加的城市数量,因此您不必在每次搜索时都计算这些城市。

所以,第1步

类似的东西:

Country    Cities    MoreAllowed
Spain      95        1
USA        45        1
UK         100       0

您可以查询此表格,看看是否仍然可以向一个国家/地区添加更多城市。

第2步:

为了更新此表,您可以在INSERT上为包含城市的表创建触发器,并且每次插入城市时都会更新此表中的数字。

通过使用此方法,您只需运行一个简单的

SELECT Cities, MoreAllowed
FROM countries_table
WHERE COUNTRY = --your_country--

并使用应用程序中返回的值来确定是否添加更多城市以及更多城市。

答案 2 :(得分:0)

我设法只使用触发器来解决问题。在这个例子中,我强制每个类别最多限制3个项目,我使用时间戳来确定哪个是最旧的并丢弃它。

CREATE TABLE mytable (category, item, timestamp);
CREATE TABLE mytable_counts (category UNIQUE, items_count);

CREATE TRIGGER update_mytable_counts AFTER INSERT ON mytable
BEGIN
    UPDATE mytable_counts
        SET items_count = items_count + 1
        WHERE category = NEW.category;
    INSERT OR IGNORE INTO mytable_counts VALUES(NEW.category, 1);
END;

CREATE TRIGGER enforce_limit AFTER UPDATE ON mytable_counts WHEN NEW.items_count > 3
BEGIN
    DELETE FROM mytable WHERE category=NEW.category AND timestamp NOT IN (SELECT timestamp FROM mytable WHERE category=NEW.category ORDER BY timestamp DESC LIMIT 3);
    UPDATE mytable_counts SET items_count = 3 WHERE ROWID=NEW.ROWID;
END;

我没有尝试优化代码,我也不知道它在大表中的表现如何。