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

时间:2014-05-02 23:20:42

标签: 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的单个表插入。有没有一种有效的方法来做到这一点?如果没有,那么会有足够快的解决方法吗?

1 个答案:

答案 0 :(得分:2)

此查询无法加速; WHERE和ORDER BY子句冲突,不能使用相同的索引;并且rule 15可以防止内部查询变平(可能允许外部查询使用某个索引)。


documentation说:

  

此时SQLite仅支持FOR EACH ROW触发器,而不支持FOR EACH STATEMENT触发器。

因此无法自动填充缓存表;在您撰写match_id之后,您必须从代码更新缓存。