sqlite - 在多行插入语句sqlite上使用触发器

标签 sqlite triggers group-concat

我正在使用一个表,为此问题的定义是这样的

CREATE TABLE players (match_id, hero_id, player_slot);


该表经常更新(每20分钟左右进行一次事务,大约插入1000次)。它包含约600万行atm,但将不断增长。我想从最新表中阅读(再次非常频繁地)以下SELECT语句。

SELECT t1.match_id,
    GROUP_CONCAT(hero_id) AS team,
    COUNT(DISTINCT hero_id) AS team_size
FROM (SELECT match_id, hero_id
      FROM players
      WHERE player_slot in (1, 2, 3, 4, 5)
      ORDER BY hero_id) t1
GROUP BY t1.match_id;


这是查询的相当简化的版本,但是每次我想要更新的版本时,运行速度仍然很慢。因此,我希望建立一个单独的表,并在插入“玩家”表时触发。幸运的是,我将始终在单个语句中插入具有给定match_id的所有记录,例如

INSERT INTO players (match_id, hero_id, player_slot) VALUES
    (1, 2, 3),
    (1, 4, 4),
    (1, 8, 5);


我想编写一个触发这些插入的触发;排序,然后对插入的行进行分组。我还没有发现如何在任何地方这样做。似乎不可能将所有行插入为可以在其上执行GROUP BY和ORDER BY的单个表。有有效的方法吗?如果没有,是否有足够快的解决方法?

最佳答案

这个查询不能太多加速。 WHERE和ORDER BY子句冲突,不能使用相同的索引;和rule 15防止内部查询变平(这可能使外部查询使用某些索引)。



documentation说:


目前,SQLite仅支持FOR EACH ROW触发器,不支持FOR EACH STATEMENT触发器。


因此不可能自动填充高速缓存表。编写match_id后,您必须从代码中更新缓存。

关于sqlite - 在多行插入语句sqlite上使用触发器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23438385/

相关文章:

Java 未经检查的方法调用

sql-server - TSQL 触发器维护增量订单完整性

.net - 在没有验证的情况下模仿验证行为

更新后的MySQL,更新同一个表的日期时间列

mysql - solr 搜索索引从使用 GROUP_CONCAT 生成的逗号分隔值中搜索文本

mysql - 具有多个连接的 GROUP_CONCAT - 我错过了什么?

java - 从sqlite android中的表中获取单行

database - 下载和使用 SQLite 数据库?

sql - SQL语法错误:“(”附近

mysql - 如何在多列中使用 MySQL group_concat() 函数