在MySQL中最后插入的记录上更新“最新记录标志”

时间:2012-10-18 18:20:28

标签: mysql database version-control

我有一个表格通过自动增量列(跟踪记录输入的顺序)和“CURRENT_FLAG”(最后插入的记录设置为1)进行版本控制。加入此表的视图始终使用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 +。

2 个答案:

答案 0 :(得分:0)

有多种方法可以获取最近添加的记录,而不是拥有额外的CURRENT_FLAG列。您可以尝试下订单并获取第一条记录:

SELECT [field1, field2, etc...] FROM `T`
WHERE [...]
ORDER BY AUTO_ID DESC
LIMIT 0, 1

答案 1 :(得分: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上有索引,优化器就会做正确的事。