Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL为数据库强制执行最多N个项的容量限制_Sql_Sqlite - Fatal编程技术网

SQL为数据库强制执行最多N个项的容量限制

SQL为数据库强制执行最多N个项的容量限制,sql,sqlite,Sql,Sqlite,我有一个数据库,我们可以在其中缓存各种数据,但它不应该变得太大,所以我需要限制它保存的相同类型的项目的数量,然后它应该拒绝新项目 因此,作为一个简化的示例,如果数据库有两列-国家和城市,则其来自“加拿大”的城市不应超过100个,来自“美国”的城市不应超过100个。如果我已经有70个来自“加拿大”的城市,并且想再添加35个,那么我应该只添加30个,然后停止在数据库中接受“加拿大”的新城市 现在我正在考虑每次添加一个项目并以这种方式强制执行策略时,使用SELECT COUNT(*)WHERE COU

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

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

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


有更好的解决方案吗?

我想到了几种解决方案。您的目标似乎是保留前N个条目和selec计数(*)where country。。也许是解决这个问题的办法。您可以为加拿大的每个条目(1、2、3--)分配计数器,但这将导致一批严格的数据。。 在MSSQL上,您可以创建一个类型为“而非”的触发器,对发生次数进行计数,并根据计数接受/拒绝。您可以接受所有输入,将其存储在数据表中,并根据查询或具有此查询的视图仅显示前100个输入


Ketil

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

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

此外,您还可以为一个国家添加城市的数量,这样您就不必每次搜索时都计算它们

因此,步骤1

比如:

Country    Cities    MoreAllowed
Spain      95        1
USA        45        1
UK         100       0
你可以查询这个表,看看你是否还能为一个国家增加更多的城市

第二步:

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

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

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

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

我设法只使用触发器来执行解决方案。在本例中,我强制每个类别最多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;
我没有尝试优化代码,我也不知道它在更大的表中会如何运行