1

我有一个表,它通过一个自动递增列(跟踪输入记录的顺序)和一个为最后插入的记录设置为 1 的“CURRENT_FLAG”来进行版本控制。加入此表的视图始终使用 CURRENT_FLAG=1,以便它们只返回最后一条记录。

所以如果结构是这样的:

AUTO_ID   PERSON_ID   PERSON_VALUE   CURRENT_FLAG
1         1           5452           0
2         1           637            1
3         2           4523           1       

下次我想插入一条记录时,我需要更新 CURRENT_FLAG。现在我执行这样的事情:

UPDATE T
LEFT JOIN (
     SELECT PERSON_ID, MAX(AUTO_ID) as AUTO_ID 
      FROM T 
  GROUP BY PERSON_ID
         ) as T1 ON T.PERSON_ID = T1.PERSON_ID and T.AUTO_ID = T1.AUTO_ID
SET T.CURRENT_FLAG = COALESCE(T.PERSON_ID / T.PERSON_ID, 0)

但是,即使在 PERSON_ID 和 AUTO_ID 上都有索引,该查询在一个相当小的表上也需要几秒钟。

这些记录是从临时表中作为一批插入的,并且不是一次插入一个人,所以我无法拉起 auto_ids 并手动设置标志或将所有 current_flags 设置为 0。

有没有人有更好的方法来编写该查询,或者使用触发器和\或其他解决方案做同样的事情?MySQL 5.0+。

4

2 回答 2

0

我和 Marc B 在一起。与其将这个 CURRENT_FLAG 保留在表中,并殴打您的服务器以使其保持最新状态,不如简单地获取每个人的最新记录,如下所示:

  SELECT T.*
     FROM T
     WHERE AUTO_ID IN 
     (
          SELECT MAX(AUTO_ID) AS AUTO_ID
            FROM T
        GROUP BY PERSON_ID
      )

您可以将其定义为视图。如果您对其应用 WHERE 子句,例如

   WHERE T.PERSON_ID = :somebody

只要您在 PERSON_ID 和 AUTO_ID 上有索引,优化器就会做正确的事情。

于 2012-10-18T18:41:53.690 回答
0

有一些方法可以获得最近添加的记录,而不是额外的CURRENT_FLAG列。您可以尝试降序并获取第一条记录:

SELECT [field1, field2, etc...] FROM `T`
WHERE [...]
ORDER BY AUTO_ID DESC
LIMIT 0, 1
于 2012-10-18T18:35:33.580 回答